it-swarm-ru.tech

Как выбрать имя каталога во время распаковки

Скажем, у меня есть файл с именем ugly_name.tar, который при извлечении становится ugly_name каталог. Какую команду я могу использовать так, чтобы результирующее имя каталога было pretty_name вместо?

132
tshepang

Это должно работать:

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
187
Mat

С 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!'
32
Gilles 'SO- stop being evil'

Самый простой способ

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
11
marquicus

Использовать этот :

tar -xvf ugly_name.tar
mv ugly_name pretty_name
9
Rupesh Mande

От 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 для того, чтобы это действительно работало. Я проверил с этой новой опцией, и она работает как для архивов с именем верхнего уровня, так и без.

3
smac89