Linux

刪除所有不包含與 glob/regex 匹配的文件名的文件夾

  • March 2, 2017

我想做以下事情。我有這樣的深度 2 文件層次結構:

A
| B
| | g
| | h50000
| C

其中 A、B、C 是文件夾。我想刪除所有沒有與特定模式匹配的文件的文件夾,(在我的情況下, 50000是模式,glob 風格)深度級別為 2。(在此範例中,文件夾 C 應與其內容一起被刪除,而 A 保留)

在我的應用程序中,如果我刪除所有子文件夾都不包含與模式匹配的文件名的文件夾,我會很好。(在不指定我要刪除的深度的情況下不刪除 A 會更容易)。

我如何能夠在 Linux 機器上的 bash 中做到這一點?

find可以排除一個模式:

find \! -name '*50000*' -delete

!由於它在 shell 中的使用,轉義是必要的。

包含內容的目錄不會被刪除。

警告:因為從你的問題來看,我有點不清楚 - 這將刪除具有50000模式的文件夾中的其他文件,例如A/B/g將被刪除,並且只50000保留具有名稱(包括其父目錄)的文件(和目錄)!


要刪除其中沒有50000文件的所有目錄並將包含此類文件的目錄與該目錄的其他內容一起保留,我建議採用兩步方法:

  1. 列出所有文件和目錄並安全放入文本文件
find . -depth -mindepth 1 > all
  1. 列出需要保留的目錄(僅查找文件和列印目錄)
find . -depth -name '*50000*' printf '%h\n' > keep
  1. 選擇倒置的可刪除文件和目錄grep
grep -vf keep all > deletable
  1. 使用此列表進行刪除(只是一個範例)
while read line 
do

  find . -wholename "$line" -delete

done < deletable

請注意,由於是逐行 shell 腳本的性質,第 4 點速度很慢。不是最好的,但會完成這項工作。


或者(更簡單):如果您具有 root 訪問權限,則中間更改- 屬性,防止更改,包括刪除,刪除所有內容(因為 - 標記的文件和目錄i不允許刪除),最後刪除該標誌。i``i

#%h goes for parent directories of our hits
find -name '*5000*' -printf '%h\0' | xargs -0 chattr -R +i '{}'
#be careful now ....
rm -r *
chattr -i -R *

引用自:https://serverfault.com/questions/835706