在目录中的每个文件中搜索目录中包含的每个文件名的提及

Search for a mention of each filename contained in a directory, in every file in the directory

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

本质上,我正在尝试更有效地重新创建每个 'filename' 的复制并粘贴到我当前正在执行的 'search in this folder' 中,因为大约有 400 个文件。作为输出,我认为最有用的格式是每个搜索词(文件名)的列表,以及它出现的唯一文件的数量。我对没有出现的文件最感兴趣,因为这些可能能够被删除,因为它们现在是多余的。

我目前的想法是将文件名列表保存到一个名为 searchterms 的文件中,然后使用 grep -r -f searchterms 查找该文件的所有匹配项。然而,我在这方面运气不佳,因为到目前为止我对 -c 的使用只是导致列出文件,而不是搜索词。

提前致谢!

用法示例:

文件1
包含文件 3
包括文件 3

file2
内容

file3
内容

file4
包括文件 3

搜索条件为:文件 1、文件 2、文件 3、文件 4。

返回的输出(以某种类似的形式):
file1: 出现在 0 个文件中
file2: 出现在 0 个文件中
file3:出现在 2 个文件中
file4:出现在 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

这算作自引用——如果你不想这样,你可以通过在上面的 grep 行前面加上 [[ "$file1" -ne "$file2" ]] && 来防止它。

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