我想查找并删除文件夹及其子文件夹中具有特定属性的所有文件:它们没有三个字母的后缀。您如何做到这一点?谢谢。
答案1
TL;DR;(自动删除内容时这确实是一个非常糟糕的想法)
find . ! -name "*.???" -type f -max-depth 1 -delete
正确解释并测试:
步骤0:设置测试环境:
mkdir test
cd test
touch test1
touch test1.bar
touch test1.foo
touch test1.baz
touch test1.bazar
步骤 1:查找所有具有三个字母扩展名的文件:
find . -name "*.???" -type f -print
./test1.bar
./test1.baz
./test1.foo
第 2 步:反转选择
find . ! -name "*.???" -type f -print
./test1
./test1.bazar
步骤 3:将 替换-print
为-delete
。
如果你不想深入子目录,请添加-max-depth=1
答案2
假设您有 bash 版本 4+(您可以使用以下方式检查bash --version
)
shopt -s extglob ## turn on extended globbing
rm -- !(*.???)
对于递归性:
shopt -s extglob globstar
rm -- **/!(*.???)
一般来说,我建议在你的 .bashrc 中放入此行,因为扩展通配符和 globstar 非常有用:
shopt -s extglob globstar
答案3
您可以尝试一下find
。
首先使用这个向他们展示以确保您获得正确的文件:
find . -type f ! -name "*.???"
当您确定要删除它们时,可以使用:
find . -type f ! -name "*.???" -print0 | xargs -0 rm -rfv
或者如果你喜欢这种-exec
方式:
find . -type f ! -name "*.???" -exec rm -rfv {} +
注意:只在特定版本及更高版本中有效(请查看第二段下的{} +
手册。否则您可以使用,但这会带来很多开销,需要为每个文件执行。man find
-exec
-exec -rfv {} \;
rm
在正确的文件夹中使用此内容。否则,请.
用文件夹名称替换。