目標是找到給定名稱的目錄並刪除其中的所有文件,保留實際目錄
find /home/www/sites/ -iname '_cache' -exec du -hs {} \;
這給了我一個文件列表及其大小
204K /home/www/sites/test.site.com/html/development/Temporary/_cache
904K /home/www/sites/test.site2.com/html/development/Temporary/_cache
可以用Linux的find指令來實現嗎?
答案1
我嘗試了一些東西,似乎它有效,這是亞歷克斯在這裡發布的類似解決方案。
find . -iname '_cache' | xargs -I {} find {} -type f -maxdepth 1 -exec rm {} \;
它應該僅刪除在 _cache 目錄中找到的文件,並且僅在該目錄中找到。它不會刪除 _cache 目錄的子目錄中的任何檔案。
當然,在使用之前嘗試一下,而不是 rm,放 ls 或其他無害的東西。
答案2
我還沒有徹底測試這個邏輯......但是你可以在循環內做一些事情,例如:
for findname in $(find /path/to/search -name '_pattern')
do
find $findname -type f
done
因此,您可以獲得與您的搜尋模式相符的文件列表,然後使用新搜尋循環遍歷每個文件,尋找要刪除的文件。
寫入的方式將為您提供一個文件列表,因此您可以將其重定向到一個文件,然後使用 rm 循環遍歷該文件。您也可以在 for 迴圈中將 exec 附加到 find 中。我當然建議首先按照編寫的方式運行來測試邏輯並確保匹配看起來不錯。
答案3
刪除它的正確命令
find . -iname '_cache' | xargs -I {} find {} -type f -maxdepth 1 -delete
答案4
find 有一個 -delete 選項。這將刪除所有匹配項。
從手冊頁
-刪除
Delete files; true if removal succeeded. If the removal failed, an error message is issued. If -delete fails, find's exit stat- us will be nonzero (when it eventually exits). Use of -delete automatically turns on the -depth option. Warnings: Don't forget that the find command line is evaluated as an expression, so putting -delete first will make find try to delete everything below the starting points you specified. When testing a find command line that you later intend to use with -delete, you should explicitly specify -depth in order to avoid later surprises. Because -delete implies -depth, you cannot usefully use -prune and -delete together.