我想創建帶有執行find
命令後產生的所有輸出文件的tar文件。查詢ragarding Solaris查找帶-exec選項的命令
我嘗試下面的命令:
find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \;
但它僅包括在test.tar
文件的最後一個找到的文件。如何在test.tar
文件中包含所有文件?
問候 切塔尼亞
我想創建帶有執行find
命令後產生的所有輸出文件的tar文件。查詢ragarding Solaris查找帶-exec選項的命令
我嘗試下面的命令:
find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \;
但它僅包括在test.tar
文件的最後一個找到的文件。如何在test.tar
文件中包含所有文件?
問候 切塔尼亞
使用命令行替換:
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`
雖然反引號更便攜,$()符號是比較容易,如果你需要嵌套的命令行替換。
你想通過管道將找到焦油中找到的文件名。
是。你是對的。 – 2009-12-08 07:16:33
find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \;
但它僅包括在test.tar文件的最後一個找到的文件。
這是因爲對於每個文件,它都會發現它正在運行一個新的tar命令,該命令會覆蓋上一個命令中的tar文件。
您可以通過改變\;
到+
使發現一批文件一起,但如果有更多的 文件不是可以一次上市,發現仍然會運行多個命令,每個覆蓋從以前的一個tar文件。您可以通過xargs管道輸出,但它有可能多次運行該命令的相同問題。上面建議的命令行替換是我知道的最安全的方法,確保tar只能被調用一次 - 但是如果找到太多文件,它可能會導致命令行過長的錯誤。
這應該平等合作:
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
這受制於shell擴展緩衝區的大小限制 - 這就是管道避免的情況。 – Don 2009-12-08 14:41:20