2010-04-08 57 views
50

如何將信息輸入tar指定文件的名稱?如何從stdin建立一個tar?

+0

我認爲@geekosaur應該打勾,因爲是更好地匹配問題的迴應。 – 2013-09-25 08:33:57

+0

我改變了選擇的答案,你是對的。 – 2013-10-04 03:02:56

回答

80

喜歡的東西:

tar cfz foo.tgz -T - 

但請記住,這不適用於所有可能的文件名;您應該考慮--null選項並從find -print0供應tar。 (該xargs例如將大文件列表不太工作,因爲它會產生多個tar命令。)

5

而不是使用管道,你可以使用反引號,例如:

tar cvzf archive.tgz `ls -1 *` 

相反的ls -1 *你可以把它產生存檔所需的文件

的列表中的任何其他命令
+10

唯一的問題是,如果ls命令的輸出長於shell的最大允許命令行大小,這將不起作用。在這種情況下,您必須按照其他答案的說法來做;允許列表任意長。此外,「find [...] print0」允許您創建一個具有特殊字符的成員的tar文件,而ls方法則不會。這種方法並不安全或普遍適用。 – 2012-10-16 17:33:50

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

前面已經指出的geekosaur,也沒有必要管find輸出到xargs因爲它可以使用find ... -print0 | tar --null ...直接輸出findtar

注中雖然不包括檔案文件gnutarbsdtar之間的細微差別。

# 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 - 
+0

如果在當前目錄中找到,那麼只需使用../file.tar.gz作爲目標就足夠了。 – 2016-12-12 02:22:44

13

擴展geekosaur answer

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

您可以使用標準輸入與-T選項。

請注意,如果您在使用一般的一定條件下(例如-name選項)過濾文件,你需要排除目錄在管,否則將焦油處理他們所有的內容,這是不是你想要的。因此,使用方法:

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

如果你不使用-type,匹配"mypattern"目錄下的所有內容將被添加!

+0

我認爲這種方法比其他方法更好,因爲您可以管道輸出到標準輸出的任何東西 – daks 2013-09-17 07:20:31

+0

您可能想要考慮使用'find'來具體說明文件類型。具體來說,我會'find -type f'。這將排除符號鏈接,字符設備等。 如果你對'find -type f -o -type d'感興趣的空目錄。 – JamesThomasMoon1979 2015-09-30 02:32:11

0

爲了獲得更好的壓縮效果,使用bzip2可能會有幫助。

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