Как я могу собрать tar из stdin? - PullRequest
61 голосов
/ 08 апреля 2010

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

Ответы [ 7 ]

93 голосов
/ 05 марта 2011

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

tar cfz foo.tgz -T -

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

22 голосов
/ 02 марта 2012

Как уже указывал geekosaur, нет необходимости направлять вывод 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 -
15 голосов
/ 28 декабря 2012

Расширение ответ 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 голосов
/ 23 ноября 2011
find /directory > filename
tar -T filename -cf archive.tar
4 голосов
/ 08 апреля 2010

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

tar cvzf archive.tgz `ls -1 *`

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

0 голосов
/ 07 июня 2018

Программа tar реализована различными способами. Например, в версии Unix от IBM AIX , tar использует параметр -L вместо -T и требует файл вместо разрешения - для указания STDIN:

Usage: tar -{c|r|t|u|x} [ -BdDEFhilmopRUsvwZ ] [ -Number ] [ -f TarFil e ]
       [ -b Blocks ] [ -S [ Feet ] | [ Feet@Density ] | [ Blocksb ] ]
       [ -L InputList ] [-X ExcludeFile] [ -N Blocks ] [ -C Directory ] File ...
Usage: tar {c|r|t|u|x} [ bBdDEfFhilLXmNopRsSUvwZ[0-9] ] ]
       [ Blocks ] [ TarFile ] [ InputList ] [ ExcludeFile ]
       [ [ Feet ] | [ Feet@Density ] | [ Blocksb ] ] [-C Directory ] File ...
0 голосов
/ 15 октября 2015

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

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