首页 > 解决方案 > Bash for 循环从多个目录中删除不带后缀的文件

问题描述

我有 5000 个需要清理的目录。我想运行一个脚本来删除没有后缀的文件并保留带有任何后缀的文件。我知道所有没有后缀的文件都可以安全地删除,因为这些目录包含各种类型的图像。我试过这个:

for i in $(ls -d */)
do 
  rm $i !(*.*)
done

我收到语法错误

syntax error near unexpected token `('
`  rm $i !(*.*)'

我真的不想重复这个过程 5000 次。任何帮助将不胜感激!

标签: linuxbash

解决方案


请不要遍历ls. 这是非常危险的,容易出错的,作者强烈反对。此外,如果您只想查找文件并删除它们,该find实用程序将更有效地执行此操作。

最基本的版本是:

$ find . -mindepth 2 -type f ! -name "*.*" -delete

这是有效的,因为您不会启动 5000 个进程rm(每个目录一个)。事实上,这只是一个过程。find将调用unlink()删除文件,因为它找到它。


推荐阅读