2009-12-08 94 views
1

我想創建帶有執行find命令後產生的所有輸出文件的tar文件。查詢ragarding Solaris查找帶-exec選項的命令

我嘗試下面的命令:

find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \; 

但它僅包括在test.tar文件的最後一個找到的文件。如何在test.tar文件中包含所有文件?

問候 切塔尼亞

回答

2

使用命令行替換:

tar cf test.tar $(find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7) 

這樣做是在$運行命令(),使輸出的外部命令的命令行參數。

這使用更現代的bash符號。如果您不使用bash,你也可以使用這應該與大多數彈工作反引號:

tar cf test.tar `find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7` 

雖然反引號更便攜,$()符號是比較容易,如果你需要嵌套的命令行替換。

+0

這受制於shell擴展緩衝區的大小限制 - 這就是管道避免的情況。 – Don 2009-12-08 14:41:20

1

你想通過管道將找到焦油中找到的文件名。

+0

是。你是對的。 – 2009-12-08 07:16:33

0
find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \; 

但它僅包括在test.tar文件的最後一個找到的文件。

這是因爲對於每個文件,它都會發現它正在運行一個新的tar命令,該命令會覆蓋上一個命令中的tar文件。

您可以通過改變\;+使發現一批文件一起,但如果有更多的 文件不是可以一次上市,發現仍然會運行多個命令,每個覆蓋從以前的一個tar文件。您可以通過xargs管道輸出,但它有可能多次運行該命令的相同問題。上面建議的命令行替換是我知道的最安全的方法,確保tar只能被調用一次 - 但是如果找到太多文件,它可能會導致命令行過長的錯誤。

0

這應該平等合作:

find . -name "*.log" -o -name "*.log.*" -mtime +7 -exec tar cvf test.tar {} + 

注意 「+」 末與 「\;」。

對於一個可靠的方式,當一個非常大的數字文件將符合搜索:

find . -name "*.log" -o -name "*.log.*" -mtime +7 > /tmp/find.out 
tar cvf test.tar -I /tmp/find.out