在目录中的每个文件中搜索目录中包含的每个文件名的提及
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。对于所有未命中的文件,都会从头到尾一遍又一遍地搜索文件。根据文件的数量,这可能会花费大量时间,因此有必要进行更好的优化。
我正在尝试在我的目录中执行搜索,以计算在目录中所有文件的内容中引用每个单独文件的总次数。
本质上,我正在尝试更有效地重新创建每个 '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。对于所有未命中的文件,都会从头到尾一遍又一遍地搜索文件。根据文件的数量,这可能会花费大量时间,因此有必要进行更好的优化。