一系列数百个目录包含以下模式的文件:
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。我怎么能这样做?
答案 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行。