Как передать информацию в tar
, указав имена файлов?
Как я могу собрать tar из стандартного ввода?
Ответы (6)
Что-то типа:
tar cfz foo.tgz --files-from=-
Но имейте в виду, что это не будет работать для всех возможных имен файлов; вам следует рассмотреть вариант --null
и кормить tar
из find -print0
. (Пример xargs
не совсем подходит для больших списков файлов, потому что он порождает несколько команд tar
.)
sort
при использовании опции -print0
для find
и опции --null
для tar
, как описано, вам также необходимо указать опцию -z
для sort
.
- person Steve Jorgensen; 12.03.2020
Как уже указал 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 -
Расширение ответа гекозавра:
find /directory | tar -cf archive.tar -T -
Вы можете использовать стандартный ввод с опцией -T
.
Обратите внимание, что если вы фильтруете файлы, используя какое-либо условие (например, параметр -name
), в общем случае вам необходимо исключить каталоги в канале, иначе tar будет обрабатывать все их содержимое, а это не то, что вам нужно. Итак, используйте:
find /directory ! -type d -name "mypattern" | tar -cf archive.tar -T -
Если вы не используете -type
, будет добавлено все содержимое каталогов, соответствующих "mypattern"
!
find
. В частности, я бы сделал find -type f
. Это исключит символические ссылки, символьные устройства и т. д. Если вас интересуют пустые каталоги, чем find -type f -o -type d
.
- person JamesThomasMoon; 30.09.2015
find -path dir/to/exclude -prune
? вместо того, чтобы избегать каталога type f
? И еще, вы говорите mypattern
, но это не скороговорка, а скорее шарик, ибо узор лучше find -regex "patter"
- person Herdsman; 03.06.2020
-type f
, чтобы избежать каталогов, я рекомендую ! -type d
. Это имеет то преимущество, что не исключает другие элементы, такие как символические ссылки, fifo и т. д.
- person CODE-REaD; 07.07.2021
Вместо использования канала вы можете использовать обратные кавычки, например:
tar cvzf archive.tgz `ls -1 *`
Вместо ls -1 *
можно поставить любую другую команду, которая выдаст список необходимых для архивации файлов
Программа tar
была реализована различными способами. Например, в версии Unix от IBM: AIX, tar
использует параметр -L
вместо -T
и требует файл вместо того, чтобы разрешить -
указывать стандартный ввод:
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 ...