Відповіді:
Це має працювати:
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) І навпаки, прийнята відповідь (розміщена Матом) має функції --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-top-level [= dir] '
Розповідає tar, щоб створити новий каталог під каталогом вилучення (або той, який перейшов до `-C ') і використовувати його для захисту від tarbombs. За відсутності аргументу dir, ім'я нового каталогу буде дорівнювати базовій назві архіву (ім'я файлу мінус суфікс архіву, якщо його визнано). Будь-які імена учасників, які не починаються з цього імені каталогу (після перетворень з `--transform 'та` --strip-компоненти'), будуть встановлені з ним. Розпізнані суфікси імен файлів - `.tar ', а будь-які суфікси стиснення, розпізнавані див. See -auto-compress .
Як зазначалося в коментарях , цей метод не працює для належним чином сформованих архівів, проте, як показує інша відповідь , вам слід додати, --strip-components 1
щоб це справді працювало. Я перевірив цю нову опцію, і вона працює як для архівів з найменуванням найвищого рівня, так і для них без них.
pretty_name
, з оригінальною каталогом верхнього рівня всередині цього. Наприклад, якщо tar xzf ugly_name.tgz
створили б каталог, який називається ugly_name/
, тоді створена команда, яку ви вказали pretty_name/ugly_name/
.