【问题标题】:Search for a mention of each filename contained in a directory, in every file in the directory在目录中的每个文件中搜索目录中包含的每个文件名的提及
【发布时间】:2018-04-18 19:17:00
【问题描述】:

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

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

我目前的想法是将文件名列表保存到一个名为 searchterms 的文件中,并使用 grep -r -f searchterms 查找该文件的所有匹配项。但是,我对此并不怎么走运,因为到目前为止我对-c 的使用只是导致文件被列出,而不是搜索词。

提前致谢!

使用示例:

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

文件2
内容

文件3
内容

file4
包括文件3

搜索词将是:file1、file2、file3、file4。

返回的输出(以某种类似的形式):
file1:出现在 0 个文件中
file2:出现在 0 个文件中
文件 3:出现在 2 个文件中
file4:出现在 0 个文件中

【问题讨论】:

  • 你能举个可靠的例子吗?
  • 通常情况下,如果您投反对票,您至少应该添加一条说明理由的评论...

标签: linux bash grep cloud9-ide


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

【讨论】:

  • 这看起来很棒,有没有办法扩展它,以便它可以使用子目录的文件作为搜索词,并在这些子目录中搜索?谢谢!
  • 这是一个新问题。提出一个新问题,您可以在此处和那里的所有优秀答案中投票。一般来说,如果您了解点赞和接受答案的目的,您应该考虑点赞好看的答案。您可以链接以澄清此问题并邀请我们提供指向新问题的链接,但无论如何我们找到它的可能性很高,就像我们找到这个问题一样。但是,当唯一的满足是提供更多新工作时,回答的动力就会下降。
  • @userunknown: -m1 隐含在 -q 中。此外,建议使用-w 标志,因为这将防止来自#include "another_file1.h" 等的点击。
【解决方案2】:

这样的?

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" ]] && 来防范它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2011-10-14
    • 2012-01-27
    • 2023-02-07
    • 2020-09-11
    相关资源
    最近更新 更多