TimR75 Asked: 2022-07-01 12:25:37 +0800 CST2022-07-01 12:25:37 +0800 CST 2022-07-01 12:25:37 +0800 CST 删除文件名中包含特定字符串但不包含其他字符串的文件 772 我有一些目录,其中包含大量文件。我希望通过删除其中包含特定字符串但没有某些其他字符串的文件来修剪这些目录。 例如删除文件名中有“AAA”但没有“BBB”、“CCC”或“DDD”的文件。 这可能吗? rm 1 个回答 Voted Best Answer Kusalananda 2022-07-01T12:30:33+08:002022-07-01T12:30:33+08:00 find从您想要在其中递归搜索要删除的文件的某个顶级目录中使用: find . -type f -name '*AAA*' ! -name '*BBB*' ! -name '*CCC*' ! -name '*DDD*' -print 以上将找到当前目录中或之下的所有常规文件。在这些文件中,它将选择名称包含的文件AAA,取消选择名称包含的文件BBB,CCC或DDD(每个都!否定紧随其后的测试),然后打印仍然选择的文件的路径名。 这里使用的模式是普通的文件名通配模式(不是正则表达式)。这些需要被引用以避免在当前目录中意外匹配名称。 要删除文件,请更改-print为-delete. 由于-delete它是一个非标准谓词(尽管它是一个通常实现的谓词),因此使用-exec rm {} +它会更便携。这将rm一次执行尽可能多的选定文件。 一般来说,有两个要包含和排除的模式列表,假设bash为 shell,并假设文件名应该匹配任何包含模式,并且不匹配任何排除模式: include=( '*AAA*' '*123*' ) exclude=( '*BBB*' '*CCC*' '*DDD*' ) or_filter=() and_filter=() for pattern in "${include[@]}"; do or_filter+=( -o -name "$pattern" ) done or_filter=( "${or_filter[@]:1}" ) # remove initial -o for pattern in "${exclude[@]}"; do and_filter+=( ! -name "$pattern" ) done find . -type f \( "${or_filter[@]}" \) "${and_filter[@]}" -print
find
从您想要在其中递归搜索要删除的文件的某个顶级目录中使用:以上将找到当前目录中或之下的所有常规文件。在这些文件中,它将选择名称包含的文件
AAA
,取消选择名称包含的文件BBB
,CCC
或DDD
(每个都!
否定紧随其后的测试),然后打印仍然选择的文件的路径名。这里使用的模式是普通的文件名通配模式(不是正则表达式)。这些需要被引用以避免在当前目录中意外匹配名称。
要删除文件,请更改
-print
为-delete
.由于
-delete
它是一个非标准谓词(尽管它是一个通常实现的谓词),因此使用-exec rm {} +
它会更便携。这将rm
一次执行尽可能多的选定文件。一般来说,有两个要包含和排除的模式列表,假设
bash
为 shell,并假设文件名应该匹配任何包含模式,并且不匹配任何排除模式: