我正在尝试在我的目录中执行搜索,以计算在目录中所有文件的内容中引用每个单独文件的总次数。
基本上,我正在尝试更有效地重新创建每个“文件名”的复制和粘贴到我目前正在进行的“在此文件夹中搜索”,因为大约有400个文件。作为输出,我认为最有用的格式是每个搜索项(文件名)的列表,以及它出现的唯一文件的数量。我最感兴趣的是没有出现的文件,因为这些可能是能够被删除,因为它们现在是多余的。
我目前的想法是将文件名列表保存到名为searchterms的文件中,并使用grep -r -f searchterms
查找文件的所有匹配项。但是,我没有太多运气,因为到目前为止我对-c
的使用刚刚导致文件被列出,而不是搜索词。
提前致谢!
使用示例:
文件1
包括file3
包含file3
file2的
内容
file3的
内容
file4将
包含file3
搜索字词为:file1,file2,file3,file4。
退回的输出(以某种类似的形式):
file1:出现在0个文件中
file2:出现在0个文件中
file3:发生在2个文件中
file4:出现在0个文件中
答案 0 :(得分:0)
这样的东西?
for file in *; do
n=0
for file2 in *; do
[ grep -wq "$file" "$file2" ] && ((n+=1))
done
echo $file occurs in $n files
done
这会计算自我引用 - 如果你不希望你可以通过将[[ "$file1" -ne "$file2" ]] &&
添加到上面的grep行来防范它。
答案 1 :(得分:0)
for f1 in *; do cnt=0; for f2 in *; do grep -qw "$f1" "$f2" && ((++cnt)); done; echo "$cnt $f1"; done
1 abc-file
0 abc.lst
1 abc0-file
1 abc_-file
0 def-file
0 fixedlen
0 num1000000
0 num128
0 num30000
0 num8
0 num_%header
0 par-test.sh
0 tsv-file.tsv
人类可读:
for f1 in *
do
cnt=0
for f2 in *
do
grep -qw "$f1" "$f2" && ((++cnt))
done
echo "$cnt $f1"
done
将命中计数器放在输出中的第一个用于更简单的sort -n命令。对于大量匹配(> 9),printf将有助于提供清晰的表格格式。
Grep -m 1在第一次击中后停止搜索,但是被-q隐含。要在查找file3时不匹配file31,请使用-w。对于所有未命中,文件从头到尾一遍又一遍地搜索。根据文件的数量,这可能需要大量时间,因此需要进行更好的优化。