这是我的查找命令:
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
找到的事物的“测试”。如果一个测试失败,则不会评估下一个谓词(每个谓词之间有一个隐式的“逻辑与”,除非另有说明),并且会考虑下一个找到的名称。
- 该
\( -name "*.bak" -prune \)
位的意思是“如果名称与给定模式匹配,则将其从搜索结果中删除”。这沃勒线可以替换为! -name '*.bak*'
. -o
意思是“逻辑或”。-type f
仅适用于常规文件。-mtime "-$a"
对于修改时间戳小于$a
24 小时前的文件,将适用。-exec zgrep -q ... {} ';'
如果给定模式在文件中匹配,或者更确切地说,如果zgrep
以零退出状态退出(zgrep -q
如果找到匹配,但不会产生任何输出),则每个都将为 true。标志-e
tozgrep
将强制给定变量的值充当模式(如果其中任何一个以 开头,这很重要-
)。-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