.tar файлы без структуры каталогов

32

Я делаю .tarнекоторые файлы с путем example/super_user/Output.*.

В результате .tarвыглядит так:

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

Но я хочу, чтобы файл был похож на следующее:

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

Вы знаете, как я могу достичь этого, находясь в другом каталоге?

Der Hochstapler
источник
Обязательно избегайте тарбомб с такими архивами.
Гравитация
tar --strip-components = 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
Это ответ на проблему под рукой. Упомянутая оговорка не является проблемой в этом случае. Все остальные ответы являются обходными путями для учета вариаций в проблеме.
Joki
Это действительно решение этого вопроса. Каталог не должен быть корневым, при условии, что структура каталогов /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

репост (для ленивых чел)


Это некрасиво ... но работает ...

У меня была такая же проблема, но с несколькими папками я просто хотел выровнять все файлы. Вы можете использовать опцию "transform", чтобы передать выражение 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: неизвестный основной или оператор» в команде OSX find. Какие-нибудь советы?
TCB13
-printfэто нестандартная команда. Многие из них работают только с конкретными версиями find. Обычно мы отмечаем те , при ответе на вопрос о Super User (например , с «-blah является расширение Gnu и не будет работать везде»).
Hennes
3

Я создал временный каталог. А в каталоге созданы символические ссылки на все файлы, которые будут включены в файлы. Затем я сделал tar -h -C. так что все файлы (не ссылки, а их содержимое) включены в архив с нужным именем.

mzwt
источник
1

Если это все содержимое tarball, вы можете использовать --strip-componentsопцию tar GNU, чтобы удалить 2 уровня перед файлами.

Игнасио Васкес-Абрамс
источник
У меня есть только опция, --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.

Саравана Кумар
источник