Ответы:
Это должно работать:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-C
изменения в указанном каталоге перед распаковкой (или упаковкой). --strip-components
удаляет указанное количество каталогов из имен файлов, хранящихся в архиве.
Обратите внимание, что это не совсем переносимо. GNU tar и, по крайней мере, некоторые из BSD-таров имеют --strip-components
опцию, но, похоже, не существуют на других Unix-подобных платформах.
Хотя глупый способ сделать это работал бы почти везде.
tar xf ugly_name.tar && mv ugly_name pretty_name
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
каталог уже есть . Кстати, красота в глазах смотрящего.
С GNU tar ≥1.16 используйте --transform
для применения преобразования sed regexp к каждому имени файла (преобразование применяется к полному пути в архиве):
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
Если ugly_name
компонент верхнего уровня всех имен файлов в архиве, вам не нужно беспокоиться о точном сопоставлении:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
Если вы не знаете имя каталога верхнего уровня, вы все равно можете использовать этот метод, хотя --strip-components
вместо этого вы можете предпочесть .
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
С pax
помощью утилиты архивирования POSIX используйте -s
опцию, которая принимает в качестве аргумента выражение замены, похожее на sed.
pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'
Использовать это :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
оператор списка между этими двумя командами, поэтому вторая будет выполнена, только если первая выполнилась успешно.
ugly_name
уже существует.
Самый простой способ
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
без --strip-components 1
. (2) И наоборот, принятый ответ (опубликованный Mat)--strip-components 1
без функций --one-top-level=pretty_name
. (3) Можете ли вы объяснить, почему ваш ответ, сочетающий эти варианты, лучше, чем любой из более старых? Пожалуйста, не отвечайте в комментариях; отредактируйте свой ответ, чтобы сделать его более понятным и полным.
--strip-component 1
требуется либо методом, mkdir
либо --strip-components 1
, иначе вы просто получите pretty_name/ugly_name/
.
От askUbuntu этот ответ работал для меня:
tar zxvf ugly_name.tgz --one-top-level=pretty_name
`--One-верхнего уровня [= DIR]
Указывает tar создать новый каталог под каталогом извлечения (или переданным в `-C ') и использовать его для защиты от тарбомб. При отсутствии аргумента dir имя нового каталога будет равно базовому имени архива (имя файла минус суффикс архива, если он распознан). Любые имена членов, которые не начинаются с этого имени каталога (после преобразований из `--transform 'и` --strip-components'), будут иметь префикс. Распознаются суффиксы имен файлов `.tar ', а любые суффиксы сжатия распознаются с помощью See -auto-compress .
Как отмечено в комментариях , этот метод не работает для архивов, которые правильно сформированы, однако, как показывает другой ответ , вы должны добавить, --strip-components 1
чтобы это действительно работало. Я проверил с этой новой опцией, и она работает как для архивов с именем верхнего уровня, так и без.
pretty_name
, в котором находится исходный каталог верхнего уровня. Например, если tar xzf ugly_name.tgz
бы создать каталог с именем ugly_name/
, то команда, которую вы предоставили, создаст pretty_name/ugly_name/
.