Как я могу создать tar из stdin?

Как я могу передать информацию в tar с указанием имен файла?

Ответ 1

Что-то вроде:

tar cfz foo.tgz -T -

Но имейте в виду, что это не будет работать для всех возможных имен файлов; вы должны рассмотреть опцию --null и подать tar из find -print0. (Пример xargs не будет работать для больших списков файлов, потому что он будет порождать несколько команд tar.)

Ответ 2

Как уже указывал гейкозавр, нет необходимости транслировать вывод find в xargs, потому что можно напрямую передать вывод find на tar с помощью find ... -print0 | tar --null ....

Обратите внимание на незначительные различия между gnutar и bsdtar при исключении архивного файла.

# exclude file.tar.gz anywhere in the directory tree to be tar'ed and compressed
find . -print0 | gnutar --null --exclude="file.tar.gz" --no-recursion -czf file.tar.gz --files-from -
find . -print0 | bsdtar --null --exclude="file.tar.gz" -n -czf file.tar.gz -T -

# bsdtar excludes ./file.tar.gz in current directory by default
# further file.tar.gz files in subdirectories will get included though
# bsdtar: ./file.tar.gz: Can't add archive to itself
find . -print0 | bsdtar --null -n -czf file.tar.gz -T -

# gnutar does not exclude ./file.tar.gz in current directory by default
find . -print0 | gnutar --null --no-recursion -czf file.tar.gz --files-from -

Ответ 3

Расширение ответа geekosaur:

find /directory | tar -cf archive.tar -T -

Вы можете использовать stdin с опцией -T.

Обратите внимание, что если вы фильтруете файлы с использованием некоторого условия (например, -name), в общем случае вам нужно исключить каталоги в трубку, иначе tar будет обрабатывать все их содержимое, это не то, что вы хотеть. Итак, используйте:

find /directory -type f -name "mypattern" | tar -cf archive.tar -T -

Если вы не используете -type, будет добавлено все содержимое каталогов, соответствующих "mypattern"!

Ответ 4

Вместо использования канала вы можете использовать обратные выходы, например:

tar cvzf archive.tgz `ls -1 *`

Вместо ls -1 * вы можете поместить любую другую команду, которая создает список необходимых для архивирования файлов

Ответ 5

find /directory > filename
tar -T filename -cf archive.tar

Ответ 6

Для лучшего сжатия полезно использовать bzip2.

find $PWD -name "*.doc" > doc.filelist
tar -cvjf jumbo.tar.bz2 -T doc.filelist