Файли .tar без структури каталогів


32

Я .tarін файли з шляху example/super_user/Output.*.

Отримане .tarвиглядає приблизно так:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

Але я хочу, щоб файл був таким:

- Output.zip
- Output.xml
- Output.txt

Чи знаєте ви, як я можу цього досягти, перебуваючи в іншому каталозі?


Не забудьте уникнути tarbombs з подібними архівами.
grawity

смола - смужка-компоненти = 1000?
Заар Хай

Відповіді:


11

tar збереже структуру файлів і папок, тому я не думаю, що немає способу доручити tar, щоб вирівняти ієрархію під час створення.

Одне вирішення - тимчасово змінити каталог, створити tar, а потім повернутися назад - короткий приклад нижче:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..

27

Якщо каталог "example" знаходиться в корені файлової системи, ось інший спосіб:

tar -C /example/super_user -cvf result.tar .

це змінить каталог до точки, яку ви хочете зробити tar. Застереження полягає в тому, що якщо в / example / super_user є якісь підкаталоги, структура каталогів буде збережена для цих підкаталогів.


1
Це відповідь на проблему. Згадане застереження не є проблемою в цьому випадку. Усі інші відповіді є вирішуючими для врахування варіантів проблеми.
жокі

Це справді вирішення цього питання. Каталог не повинен бути кореневим, припустимо, що структура каталогів /home/u/foo/barпрацює /home/b, а потім tar -C foo/bar -cvf qiz.tar .працює добре. Одне застереження - це те, що ви не можете використовувати макіяж символів, тобто tar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log"або tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"не будете працювати.
Бріс

1
Слід зазначити, що ви можете використовувати -Cкілька разів в одній tarкоманді, якщо вам потрібно додати декілька файлів, поширюваних по декількох каталогах, але все-таки потрібно, щоб файл tar був рівним.
нуль298

10

Свою відповідь я опублікував тут:

/programming/13924856/unix-tar-do-not-preserve-directory-structure

репост (для ледачих ppl)


Це некрасиво ... але це працює ...

У мене була ця сама проблема, але з кількома папками я просто хотів вирівняти всі файли. Ви можете скористатися опцією "перетворити", щоб передати вираз sed і ... це працює, як очікувалося.

це вираз:

's/.*\///g' (видалити все до '/')

Це заключна команда:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info


7

Щоб створити tar (ARCHIVE.tar) з усіма файлами з каталогу (DIR), без будь-якої інформації про батьківський каталог (навіть ./), ви можете використовувати щось на зразок:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

Ви можете грати з знахідкою для обмеження глибини, вибору конкретних файлів та багатьох інших речей.

Щасти!


Я отримую команду "find: -printf: unknown unknown або operator" в OSX find команді. Якісь поради?
TCB13

-printf- це нестандартна команда. Багато з них працюють лише з певними версіями пошуку. Зазвичай ми позначаємо їх під час відповіді на запитання щодо Super User (наприклад, "-blah - це розширення Gnu і не працюватиме скрізь").
Hennes

3

Я створив тимчасовий каталог. І в каталозі створено символічні посилання на всі файли до файлів, які потрібно включити. Тоді я зробив tar -h -C. щоб усі файли (не посилання, а їх вміст) були включені в архів із потрібним ім'ям.


1

Якщо це весь вміст тарболу, ви можете скористатися --strip-componentsопцією GNU tar для видалення двох рівнів перед файлами.


У мене є лише варіант, --strip-pathале використання його нічого не змінить.

1

Ще один спосіб тимчасової зміни каталогу - це введення в дужки команд cdта tarкоманд ( ):

(cd example/super_user; tar -cvf ../../result.tar *)

Перевага цього полягає в тому, що ви завжди неявно повернетеся до початкового каталогу, коли блок буде зроблено. тобто немає необхідності pushd.. popdблоків або відстеження, куди слід cdповернутися.


0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd висуває поточний шлях до каталогу DIRта переходить до папки вмісту. Потім ви повернетесь до початкового каталогу за допомогою popd.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.