2012-07-18 85 views
9

我有以下我想做的事:
find . -maxdepth 6 (-name *.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra) -prune -o -print| tar cvf somefile.tar --files-from=-
即排除了一大堆東西,只能看6子目錄深度,然後一旦修剪完成,焦油了休息。找到xargs的和焦油

不難。管道(|)之前的位工作100%。如果我排除了焦油,那麼我得到我以後的(屏幕)。但是一旦我包括管道和焦油,它就會包含所有的東西,包括我在排除中排除的所有東西。

我試過了許多不同的迭代:
-print0 | xargs -0 tar rvf somefile.tar
-print0 | xargs -0 tar rvf somefile.tar --null --files-from = -
-print0 | tar cvf somefile.tar --null -T -

那麼我做錯了什麼?我之前做過這件事;但現在它只是給我灰色的頭髮。

+0

我相信你需要周圍的'* .tar.gz'報價,以避免它過得去'bash'傳遞給'之前擴大find' – drevicko 2013-05-06 01:07:02

回答

5

我記得做了一些像下面一行到一堆tar文件。我具體談談我想組的文件,於是我就這樣的事情

find . -name "*.xyz" | xargs tar cvf xyz.tar; 

在你的情況,我不知道爲什麼你似乎再次被包括一切

的-print之前做「-o」
+4

糾正我,如果我m錯了,但我相信如果你有很多'find'輸出的文件,'xargs'會多次運行'tar'與文件列表的子集。不幸的是,'-c'然後覆蓋了以前的tar文件,你只能得到最後一個tar文件中的最後一個。 – drevicko 2013-05-06 00:44:56

+0

你可以試試。我成功地獲得了我使用find進行搜索的7-8個文件的tar文件。這裏發生的是,Find返回輸出,並且xargs將它們饋送給生成單個tar文件的tar – rajshenoy 2013-06-10 14:35:42

+2

@jajshenoy 7-8文件可能不足以發現此問題。查看[本頁]中的「最大命令長度」部分(http:// offbytwo。COM/2011/6月26日/東西 - 你 - didnt神祕約-xargs.html)。試試'echo | xargs --show-limits'來查看xargs正在使用的命令行緩衝區的大小 - 對我來說它是131072.這是相當大的,但是如果你有幾千個文件,它會很快用完! – drevicko 2013-06-11 04:24:25

3

如果您發現正在返回目錄,那麼這些將被傳遞給tar,並且無論find命令中的排除項如何,都會包含完整內容。

所以,我認爲你需要在find中包含一個「-type f」。

13

對我來說有效的是find -print標誌的組合,然後是tar命令中的--files-from。在我的情況下,我需要tar超過5000個日誌文件,但只是使用xargs只給了我500文件在生成的文件。

find . -name "*.pdf" -print | tar -czf pdfs.tar.gz --files-from - 

你有「--files-從= - 」,當你只是想「--files - 從 - 」然後我想你需要一個 - 在CVF的前面,像下面這樣。

find . -maxdepth 6 (-name *.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra) -prune -o -print| tar -cvf somefile.tar.gz --files-from - 
+2

這是正確的解決方案,因爲使用'--files-from-'避免了xargs限制(在@ rajshenoy示例的註釋中明確指出)導致的不完整檔案的問題。 – 2015-06-22 22:04:43

0

我使用上述兩種方法的組合 - 備份一天的工作我這樣做:rm -rf new.tgz;找 。 -type f -mtime 0 | xargs tar cvf new.tgz;

0

要使用沒有選項的文件是唯一使它適用於我的文件。所有其他選項包括目錄中的所有文件,而不是我生成的列表。

這是我的解決方案:

find . ! -name '*.gz' -print | xargs tar cvzf ../logs.tar.gz --files-from