Как я могу собрать tar из стандартного ввода?

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


tar
person Kristopher Ives    schedule 08.04.2010    source источник
comment
Я думаю, что @geekosaur следует отметить, потому что это ответ, который лучше соответствует вопросу.   -  person Manolo Carrasco Moñino    schedule 25.09.2013
comment
Я изменил выбранный ответ, вы правы.   -  person Kristopher Ives    schedule 04.10.2013


Ответы (6)


Что-то типа:

tar cfz foo.tgz --files-from=-

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

person geekosaur    schedule 04.03.2011
comment
Параметр -T недоступен в HP-UX. - person Peter Mortensen; 27.06.2018
comment
@PeterMortensen установить gnu tar или bsd tar? Вам нужно будет проверить, под каким именем оно может быть в магазине приложений HP-UX... - person Yogesch; 25.11.2018
comment
Обратите внимание, что если вы хотите передавать через 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 -
person marco    schedule 02.03.2012
comment
При поиске в текущем каталоге достаточно просто использовать ../file.tar.gz в качестве места назначения. - person Johan Boulé; 12.12.2016
comment
Являются ли gnutar и bsdtar буквальными? - person Peter Mortensen; 27.06.2018

Расширение ответа гекозавра:

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

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

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

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

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

person John Sinclair    schedule 28.12.2012
comment
Я думаю, что этот метод лучше других, потому что вы можете передать все, что выводится на стандартный вывод. - person daks; 17.09.2013
comment
Возможно, вы захотите уточнить типы файлов, используя find. В частности, я бы сделал find -type f. Это исключит символические ссылки, символьные устройства и т. д. Если вас интересуют пустые каталоги, чем find -type f -o -type d. - person JamesThomasMoon; 30.09.2015
comment
@JamesThomasMoon1979, не лучше ли использовать find -path dir/to/exclude -prune? вместо того, чтобы избегать каталога type f? И еще, вы говорите mypattern, но это не скороговорка, а скорее шарик, ибо узор лучше find -regex "patter" - person Herdsman; 03.06.2020
comment
Вместо -type f, чтобы избежать каталогов, я рекомендую ! -type d. Это имеет то преимущество, что не исключает другие элементы, такие как символические ссылки, fifo и т. д. - person CODE-REaD; 07.07.2021

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

tar cvzf archive.tgz `ls -1 *`

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

person Laimoncijus    schedule 08.04.2010
comment
Единственное, это не сработает, если вывод команды ls длиннее, чем максимально допустимый размер командной строки оболочки. В таком случае вы должны сделать это, как говорится в одном из других ответов; что позволяет списку быть произвольно длинным. Кроме того, find [...] -print0 позволяет создать tar-файл, в котором есть члены со специальными символами, а метод ls — нет. Этот метод просто не так безопасен или универсально применим. - person Michael Trausch; 16.10.2012

Программа 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 ...
person Scott Centoni    schedule 07.06.2018

person    schedule
comment
Будет ли это работать для всех возможных имен файлов (см. /а>)? - person Peter Mortensen; 27.06.2018