如何从列表中排除文件
我在目录中有 ~100k 文件。我需要删除其中一些文件,不包括(15k 不同模式)模式列表:
Directory: /20210111/
Example files:
/20210111/xxx_yyy_zzz.zip
/20210111/aaa_bbb_ccc.zip
/20210111/ddd_eee_fff.zip
...
Exclude.list
ddd
aaa
...
我试过找到:
find /20210111/ -type f -iname "*.zip" ! -iname "*$(cat Exclude.list)*" -exec ...
获取错误:参数太长。因为 exclude.list 有很多行。
我怎样才能做到这一点?
回答
您可以使用grep来过滤 的输出find,然后使用xargs来处理结果列表。
find /20210111/ -type f -iname '*.zip' -print0
| grep -zvFf Exclude.list -
| xargs -0 rm
- 的
-print0,-z和-0正在使用的空字节的文件名分开的,所以文件名可以包含任何有效的字符(您不能存储包含在你的Exclude.list文字换行模式,反正)。 - grep
-F将模式解释为固定字符串而不是正则表达式。