我有一个文件夹列表,每个文件夹中有大约 600 个 .gz 文件,系统每 15 分钟自动生成一次。我需要显示 .gz 文件中重复的特定字符串。并找到该字符串所在的.gz文件?
答案1
给定一些顶级目录 ,topdir
所有压缩文件都位于该目录下,并假设您正在使用 的 GNU 实现zgrep
:
zgrep -R -l -F --include='*.gz' -e 'string' topdir
这将在任何压缩文件中搜索string
子字符串,并返回所有匹配文件的路径名。gzip
topdir
zgrep
在没有 GNU 的系统上使用zgrep
,您可能无法使用--include
.如果您只包含压缩文件,这可能不是问题topdir
,但如果您只想搜索带有.gz
文件名后缀的文件,您可以这样做
find topdir -type f -name '*.gz' -exec zgrep -l -F -e 'string' {} +
这将找到名称以.gz
under结尾的所有常规文件topdir
,并将zgrep
在尽可能大的批次上运行给定的命令。
如果你甚至没有zgrep
,你可以这样做
find topdir -type f -name '*.gz' -exec sh -c '
for pathname do
if gzip -dc "$pathname" | grep -q -F -e 'string'; then
printf "%s\n" "$pathname"
fi
done' sh {} +
这会提取每个文件并将其传递给普通的grep
.如果找到包含给定字符串的行,则打印文件的路径名。
请注意,“内部”shell 脚本是一个循环,可以轻松修改它以处理*.gz
单个目录中的所有文件:
for pathname in ./*.gz; do
if gzip -dc "$pathname" | grep -q -F -e 'string'; then
printf "%s\n" "$pathname"
fi
done
如果您想string
作为完整单词而不是子字符串进行匹配,请添加-w
到上面的调用中grep
。如果string
您希望将其解释为正则表达式,请删除-F
。
答案2
如果您正在寻找事先未知的重复字符串,这里有一个脚本,它将在一组文件中查找重复的单词(这里的单词意味着任何周围有空格的东西):
#!/bin/bash
dup_words() {
zcat $1 | tr ' ' '\n' | sed '/^$/d' | sort | uniq -c | awk '{if ($1 > 1) m=1; } END { exit(!m) } '
}
for i in *.gz
do
dup_words $i && echo $i
done
它将在每次出现空格时分割行,然后删除空行,查找并计算出现次数,最后检查是否出现超过 1 次。
循环仅输出文件名,您可以&&
根据需要调整之后的操作。
答案3
您可以使用此命令来查找该字符串是否出现在某个文件夹下的某些 .gz 文件中:
zgrep the_string *.gz -l
要对全部位于一个文件夹中的文件夹列表执行此操作:
find . -name "*.gz" | xargs zgrep the_string -l
例如,输出是这样的:
./tmp/2/F.tar.gz
./tmp/2/F1.tar.gz
./tmp/1/F.tar.gz
./tmp/1/F1.tar.gz
现在您将获得包含该字符串的文件列表。
答案4
你可以使用这个命令 -
zgrep "foo" $(find . -name "*.gz")