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

Was*_*haW 0 shell-script

这是我的查找命令:

find -mtime -$a | xargs zgrep -il ''$b'' | xargs zgrep -il ''$c'' | xargs zgrep -il ''$d'' | xargs zgrep -il 'ST.997' | sort -u
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

example_file.dat.Z
example2_file.dat.Z
example3_file.dat.Z
example4_file.dat.Z
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 6

这是我的看法:

$ 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
Run Code Online (Sandbox Code Playgroud)

或者

$ 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
Run Code Online (Sandbox Code Playgroud)

给出的每个“谓词”都find将作为对所find发现事物的“测试” 。如果一个测试失败,则不会评估下一个谓词(每个谓词之间有一个隐含的“逻辑与”,除非另有说明),而是考虑下一个找到的名称。

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

如果您不愿意更改整个命令,则黑客的修复方法是通过grep -v '\.bak'或简单地传递原始命令的结果grep -vF '.bak',但是就您的命令目前而言,它会遇到具有异国文件名的文件(例如包含换行符的名称)的问题)。