Скажем, у меня есть файл с именем ugly_name.tar
, который при извлечении становится ugly_name
каталогом. Какую команду я могу использовать, чтобы полученное имя каталога было pretty_name
вместо этого?
125
Это должно работать:
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 к каждому имени файла (преобразование применяется к полному пути в архиве):Если
ugly_name
компонент верхнего уровня всех имен файлов в архиве, вам не нужно беспокоиться о точном сопоставлении:Если вы не знаете имя каталога верхнего уровня, вы все равно можете использовать этот метод, хотя
--strip-components
вместо этого вы можете предпочесть .С
pax
помощью утилиты архивирования POSIX используйте-s
опцию, которая принимает в качестве аргумента выражение замены, похожее на sed.источник
Использовать это :
источник
&&
оператор списка между этими двумя командами, поэтому вторая будет выполнена, только если первая выполнилась успешно.ugly_name
уже существует.Самый простой способ
источник
--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 этот ответ работал для меня:
Обновить
Как отмечено в комментариях , этот метод не работает для архивов, которые правильно сформированы, однако, как показывает другой ответ , вы должны добавить,
--strip-components 1
чтобы это действительно работало. Я проверил с этой новой опцией, и она работает как для архивов с именем верхнего уровня, так и без.источник
pretty_name
, в котором находится исходный каталог верхнего уровня. Например, еслиtar xzf ugly_name.tgz
бы создать каталог с именемugly_name/
, то команда, которую вы предоставили, создастpretty_name/ugly_name/
.