Відповіді:
Це має працювати:
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/.