LS |查詢 | rm -- 如何格式化該指令?

LS |查詢 | rm -- 如何格式化該指令?

我正在嘗試刪除某個目錄中的一堆檔案(在 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]\)*

不要透過管道連接lsxargs.相反,請透過管道傳輸find ... -print0xargs -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使用通配符。


通常,lsfind換行符號分隔檔案名,但xargs用換行符號分割其輸入或者空間,導致您看到的行為。

可以告訴xargs僅按換行符號分割,但文件他們的名字中也有換行符。事實上,在 Linux 和 BSD 上,僅有的 不允許的字符是個“無效的”或零位元組– 所以在這種情況下你應該使用它。

在上面的範例 2 中,-print0告訴find用空位元組分隔檔案名稱;同樣對於xargs -0. (其他一些工具也有類似的選項,例如sort -zgrep -zZ。)

「簡短版本」使用簡單的 shell 通配符(「模式」在bash手動的– 請參閱「路徑名擴充」部分)。

相關內容