2009-10-19 56 views
11

我正在嘗試編寫一個bash命令,它將刪除所有匹配特定模式的文件 - 在本例中,它是所有已構建的vmware日誌文件。Shell腳本:使用bash與xargs

我試過這個命令:

find . -name vmware-*.log | xargs rm 

然而,當我運行命令,它都具有名稱中有空格的文件夾嗆了。有沒有辦法格式化文件路徑,以便xargs將它傳遞給rm引用或正確轉義?

+0

交叉貼:http://serverfault.com/questions/76031/shell-scripting-using-find-to-delete-files-matching-a-pattern – 2009-10-19 20:18:03

回答

24

嘗試使用:

find . -name vmware-*.log -print0 | xargs -0 rm 

這使得找到輸出的每個文件名後空字符,並告訴xargs的分手基於空字符,而不是空格或其他標記的名稱。

5

查看-0標誌爲xargs;結合find-print0你應該設置。

find . -name vmware-*.log -print0 | xargs -0 rm 
9

不要使用xargs。找到能做到這一點沒有任何幫助:

find . -name "vmware-*.log" -exec rm '{}' \;

+3

它總是好的以避免開始一個額外的過程,特別是像這樣的事情,你可以提供一些方式來xargs太長。請注意,'find'甚至可以使用'delete'動作來代替'-exec ...' - 但這樣更容易定製。你也不必引用花括號,除非你使用像tcsh這樣的舊shell。 – Cascabel 2009-10-19 18:35:17

+3

但是,這將爲每個文件單獨啓動一個'rm'進程,而不是象'xargs'那樣將多個文件名傳遞給'rm',所以它會變慢。 – JaakkoK 2009-10-19 18:37:03

+5

@jk:這就是爲什麼較新的'find'實現具有'find -exec rm'{}'+',這將像'xargs'一樣對參數進行批量處理。 – ephemient 2009-10-19 18:53:32

4

GNU查找模式搜索

find . -name vmware-*.log -delete 
1

find . -name vmware-*.log | xargs -i rm -rf {}

0
find -iname pattern 

使用-iname

0

爲了避免xargs的空間問題,我'd使用新的行字符作爲sep arator與-d選項:

find . -name vmware-*.log | xargs -d '\n' rm