我想要做以下事情。 我有深度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议使用两步法:
列出所有的文件和目录,并安全的文本文件
find . -depth -mindepth 1 > all
列出需要保存的目录(仅查找文件和打印目录)
find . -depth -name '*50000*' printf '%h\n' > keep
用反转的grepselect可删除的文件和目录
grep -vf keep all > deletable
使用这个列表删除(只是一个例子)
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 *