在目录

时间:2018-04-18 19:17:01

标签: linux bash grep cloud9-ide

我正在尝试在我的目录中执行搜索,以计算在目录中所有文件的内容中引用每个单独文件的总次数。

基本上,我正在尝试更有效地重新创建每个“文件名”的复制和粘贴到我目前正在进行的“在此文件夹中搜索”,因为大约有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个文件中

2 个答案:

答案 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。对于所有未命中,文件从头到尾一遍又一遍地搜索。根据文件的数量,这可能需要大量时间,因此需要进行更好的优化。