Как я могу создать 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