Ответы:
Это должно работать:
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/.