删除不包含文件名匹配glob / regex的所有文件夹

我想要做以下事情。 我有深度2文件层次结构像这样:

A | B | | g | | h50000 | C 

A,B,C是文件夹。 我想删除所有没有匹配特定模式文件的文件夹(在我的情况下, 50000是模式,glob风格)在深度级别2(在这个例子中,文件夹C只应该被删除,除了内容,而A仍然)

在我的应用程序,我很好,如果我删除所有的文件夹都没有包含文件名匹配模式的文件夹。 (如果不指定要删除哪个深度,将会更容易删除A)。

我怎么能在Linux机器上的bash中做到这一点?

find你可以排除一个模式:

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

逃跑! 由于其在贝壳中的使用是必要的。

包含内容的目录不会被删除。

警告:因为从你的问题,这是有点不清楚,这将删除具有50000模式的文件夹中的其他文件,例如A/B/g将被删除,只有名称50000 (包括他们的父母直播)保存!


为了删除所有在其中没有50000文件的目录,并将这些文件与这个目录的其他内容一起保存在目录中,我build议使用两步法:

  1. 列出所有的文件和目录,并安全的文本文件

     find . -depth -mindepth 1 > all 
  2. 列出需要保存的目录(仅查找文件和打印目录)

     find . -depth -name '*50000*' printf '%h\n' > keep 
  3. 用反转的grepselect可删除的文件和目录

     grep -vf keep all > deletable 
  4. 使用这个列表删除(只是一个例子)

     while read line do find . -wholename "$line" -delete done < deletable 

请注意,由于作为每行一行的shell脚本的本质,点4是缓慢的。 不是最好的,但会做的工作。


或者(更简单):如果你有根访问intermedially更改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 *