Find

如何刪除被awk過濾掉的文件

  • April 23, 2012

我在一個目錄中有以下文件:

-rw-r--r-- 1 smsc sys  46 Apr 22 12:09 bills.50.1.3G.MO.X.20120422120453.Z
-rw-r--r-- 1 smsc sys  28 Apr 22 12:15 bills.50.1.3G.MO.X.20120422120953.Z
-rw-r--r-- 1 smsc sys  46 Apr 22 12:20 bills.50.1.3G.MO.X.20120422121453.Z
-rw-r--r-- 1 smsc sys  46 Apr 22 12:25 bills.50.1.3G.MO.X.20120422121953.Z

第五列是文件的大小。我希望刪除所有大小為 46 的文件。為了過濾掉這些文件,我使用了以下命令:

ls -ltr | awk '$5 ~ /46/ {print $0}'

哪個工作正常。但是現在我想刪除所有被過濾掉的文件,所以我在上面的命令中添加了以下內容:

ls -ltr | awk '$5 ~ /46/ {print $0}' | xargs rm

但是它給了我以下錯誤:

rm: invalid option -- w

看來我必須使用findoverls所以我將得到以下格式的輸出:

./bills.50.1.3G.MO.X.20120421050453.Z
./bills.50.1.3G.MO.X.20120421154953.Z
./bills.50.1.3G.MO.X.20120419133452.Z

但是我無法通過其參數過濾文件。如何完成這項任務?

你有兩個錯誤:

  1. 您正在比較包含 46; 你希望它等於46。
  2. 當您只需要文件名時,您正在列印整行。

還有一個問題:當您不使用排序順序時,對輸出進行排序有什麼-ltr意義?ls

你想做類似的事情

ls -l | awk '$5 == "46" {print $9}' | xargs rm

除非您不想這樣做,因為雖然目前它可能是安全的,但解析ls輸出是不可靠的。使用適當的工具,例如

find . -maxdepth 1 -size 46c -delete # requires GNU find

(這樣做更煩人,因為 POSIXfind沒有-maxdepth-size在塊以外的單元中執行。最好在 Perl/Python/Ruby/etc 中編寫腳本,它可以使用不會得到的正確目錄掃描文件名中的特殊字元有問題。)

引用自:https://unix.stackexchange.com/questions/37052