如何输出排除某些文件扩展名的查找命令的结果

如何输出排除某些文件扩展名的查找命令的结果

这是我的查找命令:

find -mtime -$a | xargs zgrep -il ''$b'' | xargs zgrep -il ''$c'' | xargs zgrep -il ''$d'' | xargs zgrep -il 'ST.997' | sort -u

这是上述命令的输出示例:

example_file.dat.Z
example2_file.dat.Z
example2_file.dat.bak.1234567890.Z
example3_file.dat.Z
example3_file.dat.bak.Z
example4_file.dat.Z
example4_file.dat.bak.qwertyuiop.Z

如您所见,它输出带有“.bak”扩展名的相同文件。我想要的是每当我运行脚本时排除/不显示该文件。就像这个例子的输出:

example_file.dat.Z
example2_file.dat.Z
example3_file.dat.Z
example4_file.dat.Z

编辑:我忘了。有时它是 zip 文件。

答案1

这是我的看法:

$ find . \( -name '*.bak*' -prune \) -o \
      -type f -mtime "-$a" \
      -exec zgrep -iq -e "$b" {} ';' \
      -exec zgrep -iq -e "$c" {} ';' \
      -exec zgrep -iq -e "$d" {} ';' \
      -exec zgrep -iq 'ST.997' {} ';' \
      -print | sort

或者

$ find . ! -name '*.bak*' \
      -type f -mtime "-$a" \
      -exec zgrep -iq -e "$b" {} ';' \
      -exec zgrep -iq -e "$c" {} ';' \
      -exec zgrep -iq -e "$d" {} ';' \
      -exec zgrep -iq 'ST.997' {} ';' \
      -print | sort

每个给定的“谓词”都find将充当对所find找到的事物的“测试”。如果一个测试失败,则不会评估下一个谓词(每个谓词之间有一个隐式的“逻辑与”,除非另有说明),并且会考虑下一个找到的名称。

  1. \( -name "*.bak" -prune \)位的意思是“如果名称与给定模式匹配,则将其从搜索结果中删除”。这沃勒线可以替换为! -name '*.bak*'.
  2. -o意思是“逻辑或”。
  3. -type f仅适用于常规文件。
  4. -mtime "-$a"对于修改时间戳小于$a24 小时前的文件,将适用。
  5. -exec zgrep -q ... {} ';'如果给定模式在文件中匹配,或者更确切地说,如果zgrep以零退出状态退出(zgrep -q如果找到匹配,但不会产生任何输出),则每个都将为 true。标志-etozgrep将强制给定变量的值充当模式(如果其中任何一个以 开头,这很重要-)。
  6. -print将输出名称(该谓词始终为“true”)。

如果你不愿意改变所有的命令,一个被黑客修复的方法是简单地通过grep -v '\.bak'or传递原始命令的结果grep -vF '.bak',但就您当前的命令而言,具有异国情调文件名的文件(例如,包含换行符的名称)将会出现问题。

答案2

我终于找到了答案。经过长时间的实验。哈哈

这里是:

find -mtime -$a -type f ! -name "*.bak*" | xargs zgrep -il "$b" | xargs zgrep -il "$c" | xargs zgrep -il "$d" | xargs zgrep -il 'ST.997' | sort -u

相关内容