原文地址:find + xargs 刪除文件名中含有空格的文件 作者:flightbird
查找某個目錄下更改時間超過7天的文件並刪除它們。
方法一:
$ find . -type f -mtime +7 -print -exec rm {} \;
問題來了,在使用find命令的-exec選項處理匹配到的文件時,find命令將所有匹配到的文件一起傳遞給exec執行。不幸的是,有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鍾之后,就會出現溢出錯誤。錯誤信息通常是"參數列太長"或"參數列溢出"。這就是xargs命令的用處所在,特別是與find命令一起使用。find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,並如此繼續下去。在有些系統中,使用-exec選項會為處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高;而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。
方法二:
$ find . -type f -mtime +7 -print | xargs rm
還是有問題:當有許多包含空格、圓括號和其他“禁用”字符的文件時, xargs處理起來會比較困難。幸運的是,在Linux下find命令有一個選項-print0,它以null字符分隔輸出的文件名而不是用新行字符。tar 和 xargs 等命令有 -0(或 --null)選項,這使它們能夠理解這種形式的參數。
方法三:
$ find . -type f -mtime +7 -print0 | xargs -0 rm
但是遺憾的是這種方法在Solaris下不支持!不過不用擔心,也有解決的方法:
方法四:
$ find . -type f -mtime +7 -print | while read l; do rm "$l";done
方法五:
$ find . -type f -mtime +7 -print | xargs -i echo '"{}"' | xargs rm