仅从某些子目录中删除匹配的文件

仅从某些子目录中删除匹配的文件

我有一个包含几个子目录的目录;在每个文件中,我都有一些文件。我想grep仅对某些子目录执行 a 来查找与查询匹配的文件并将其删除;类似的东西 grep -rl --exclude-dir=dir1 --exclude-dir=dir2 HUMAN . | rm,但我不想解析stdinfrom grep

我想我必须结合findrm,但我不知道如何结合。

此外,似乎(至少在 Cygwin 中),我不能这样做 --exclude-dir={dir1, dir2},我必须将它们分开。这是一个小问题,但有人知道为什么这不起作用吗?

答案1

grep -rlZ --exclude-dir=dir1 --exclude-dir=dir2 HUMAN . |
  xargs -r0 rm -f

如果要find进行目录遍历:

find . -type d \( -name dir1 -o -name dir2 \) -prune -o \
  -type f -exec grep -lZ HUMAN {} + |
  xargs -r0 rm -f

可移植/标准地,这必须是:

find . -type d \( -name dir1 -o -name dir2 \) -prune -o \
  -type f -exec grep -q HUMAN {} \; -exec rm -f {} +

但这意味着grep每个文件运行一个。

为了--exclude-dir={dir1,dir2}工作,您需要一个支持大括号扩展的 shell,例如 csh、tcsh、ksh、zsh、bash 或 Fish。

相关内容