我正在嘗試刪除某個目錄中的一堆檔案(在 Mac OS X 上使用終端)
ls | grep \([1-9]\) | xargs rm
應該可以解決問題,但事實並非如此。我試圖刪除檔案名稱中括號中包含單一數字的任何檔案(從網路下載的重複項),但最終會執行以下操作:
> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory
因為它不能正確解釋空間。它應該刪除“520syllabus2010(3).pdf”
這樣做的正確方法是什麼?
謝謝,傑夫
答案1
簡潔版本:
rm *\([1-9]\)*
不要透過管道連接ls
到xargs
.相反,請透過管道傳輸find ... -print0
到xargs -0
,以避免此類問題。
find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm
……可以寫成:
find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;
和:
find . -maxdepth 1 -name '*([1-9])*' -delete
可以進一步縮短為僅rm
使用通配符。
通常,ls
用find
換行符號分隔檔案名,但xargs
用換行符號分割其輸入或者空間,導致您看到的行為。
可以告訴xargs
僅按換行符號分割,但文件能他們的名字中也有換行符。事實上,在 Linux 和 BSD 上,僅有的 不允許的字符是個“無效的”或零位元組– 所以在這種情況下你應該使用它。
在上面的範例 2 中,-print0
告訴find
用空位元組分隔檔案名稱;同樣對於xargs -0
. (其他一些工具也有類似的選項,例如sort -z
或grep -zZ
。)
「簡短版本」使用簡單的 shell 通配符(「模式」在bash
手動的– 請參閱「路徑名擴充」部分)。