递归删除与正则表达式不匹配的文件

递归删除与正则表达式不匹配的文件

我试图从文件夹树中清除一堆临时文件,但不想删除符合某些条件的文件,特别是可执行文件、.tpl 文件,而不是子文件夹“data”。

我在这里看到这个问题

使用 Mac 终端删除目录中与正则表达式匹配的文件

几乎是我正在寻找的,但他们有一个正则表达式,他们试图匹配,而我有一个正则表达式,我不想要匹配。我可以这样做来查找所有不删除的文件:

find . -executable -o -regex '.*\.tpl'

有没有办法反转匹配,就像 -v 对正则表达式所做的那样?

答案1

有没有办法反转匹配,就像 -v 对正则表达式所做的那样?

使用否定( !):

find . -executable -o ! -regex '.*\.tpl' -exec rm -i {} \+

答案2

对除匹配某些条件的文件之外的所有内容运行命令的一种便捷方法是利用 的-o短路行为,例如,find -cond1 -cond2 -o -exec command意味着“如果cond1然后cond2不执行任何操作,则执行command”。

find . -type f -executable -o -name '*.tpl' -o -exec rm -i {} \+

要排除该data目录,请使用该-prune操作,这意味着“跳过该目录并且不递归到该目录”。用于-name data匹配所有名为 的目录data,或-path ./data仅在顶层进行匹配。

find . -type f -executable -o \
       -name '*.tpl' -o \
       -type d -name data -prune -o \
       -exec rm -i {} \+

奖励:zsh 中相同。

rm -i -- **/*~*.tpl~data/*(.^*)
  • ~操作员排除与某些模式匹配的文件(您必须setopt extended_glob首先执行此操作)。
  • **/施行递归通配符
  • . 全局限定符将整个匹配限制为常规文件,并^*排除可执行文件(^否定后面的限定符;限定符是与)。

相关内容