如何删除包含类似命名文件的目录中的一组文件?

时间:2016-06-08 18:53:54

标签: bash shell

一系列数百个目录包含以下模式的文件:

Dir1:
-text_76.txt  
-text_81.txt   
-sim_76.py   
-sim_81.py

Dir2:
-text_90.txt  
-text_01.txt   
-sim_90.py   
-sim_01.py

在每个目录中,以text或sim开头的文件基本上分别与其他文本或sim文件重复。每组重复文件都有唯一的数字标识符。我只希望每个目录一套。因此,在Dir1中,我想删除标记为81或76的集合中的所有内容,没有偏好。同样,在Dir2中,我想删除标记为90或01的集合。每个目录恰好包含两个集合,并且无法预测每个目录中使用的随机数字ID。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

假设您总是有1个已知文件,比如text_xx.txt,那么您可以在每个子目录中运行此脚本:

ls text_*.txt | { read first; rm *"${first:4:4}"*; };

这将列出与通配符模式text_*.txt匹配的所有文件。使用read仅获取ls命令的第一个匹配结果。这将导致$first shell变量包含一个完全展开的匹配:text_xx.txt。在${first:4:4}子字符串之后,通过了解_xx.test_的长度,将此完全展开的匹配符号设置为xx。最后,rm *""*将通配符附加到搜索结果中,并将其作为命令执行:rm *_xx.*

我选择在_周围加.xx,对删除的内容保守一点。

如果xx的长度未知,事情会变得复杂一些。更不安全的命令可能是:

ls text_??.txt | { read first; rm *_"${first:5:2}".*; };

这应删除一个"文件集"每次在给定的子目录中运行。如果只有一个文件集,它仍然会删除文件集。

编辑:简化以删除不必要的IFS命令使用。

修改:尝试展开并澄清说明。

答案 1 :(得分:0)

ls | grep -P "*[81|76]*" | xargs -d"\n" rm
ls | grep -P "*[90|01]*" | xargs -d"\n" rm

工作原理:

ls列出所有文件(由于结果是管道传输的,因此逐行显示)。

grep -P过滤器

xargs -d“\ n”rm对每个传送给它的行执行一次rm行。