这是我的查找命令:
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 文件中。
这是我的看法:
$ 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
发现事物的“测试” 。如果一个测试失败,则不会评估下一个谓词(每个谓词之间有一个隐含的“逻辑与”,除非另有说明),而是考虑下一个找到的名称。
\( -name "*.bak" -prune \)
位的意思是“如果名称与给定的模式匹配,则将其从搜索结果中删除”。这条wole 行可能被替换为! -name '*.bak*'
。-o
表示“逻辑或”。-type f
仅适用于常规文件。-mtime "-$a"
对于修改时间戳小于$a
24 小时前的文件,将是 true 。-exec zgrep -q ... {} ';'
如果给定的模式在文件中匹配,或者更确切地说,如果zgrep
以零退出状态退出(zgrep -q
如果找到匹配,但不会产生任何输出),则每个都将为真。该-e
标志zgrep
将迫使给出变量的值作为图案(该事项如果其中任何开头-
)。-print
将输出名称(此谓词始终为“true”)。如果您不愿意更改整个命令,则黑客的修复方法是通过grep -v '\.bak'
或简单地传递原始命令的结果grep -vF '.bak'
,但是就您的命令目前而言,它会遇到具有异国文件名的文件(例如包含换行符的名称)的问题)。