Как я могу построить смолу из stdin?


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

7 54

7 ответов:

что-то типа:

tar cfz foo.tgz -T -

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

как уже указывал geekosaur, нет необходимости трубить выход find to 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 -

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

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

вы можете использовать stdin с .

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

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

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

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

tar cvzf archive.tgz `ls -1 *`

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

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

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

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

The tar программа была реализована различными способами. Например, в IBM версии Unix,AIX,tar использует , а не -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 ...