【问题标题】:using linux cmds to match a list names against a bunch of files使用 linux 命令将列表名称与一堆文件进行匹配
【发布时间】:2011-10-16 17:02:48
【问题描述】:

我在匹配文件名方面有一点问题。

我有一个包含大约 160 个名称的文本文件。我有一个包含 2000 多个文件的文件夹。其中一些包含这 160 个名称。我正在寻找一个 grep cmd,它可以获取文本文件中的每个名称并尝试将其与文件夹的内容相匹配。

我正在尝试在 perl 中执行此操作,或者直接在 linux cmds 中执行此操作,但对我来说都没有很好的效果,因为我不熟悉它们中的任何一个。

例如:文本文件包含

abc acc eee fff

文件夹中会有abcXXX、accXXX、eeeXXX和fffXXX

我需要对列表进行排序并找出丢失的列表。

谢谢 戴维

【问题讨论】:

    标签: linux file command-line matching


    【解决方案1】:

    如果您在文件的内容中搜索:

    #!/bin/sh  
    for i in `cat files`
    do
        grep -R $i folder --color
    done
    

    如果您搜索文件的文件名:

    #!/bin/sh 
    for i in `cat files`
    do
    find . -name $i*
    done
    

    【讨论】:

      【解决方案2】:
      for file in $(< list); 
      do 
         [ ! -f ${file}xxx ] && echo "x: " ${file}xxx
      done
      

      list 是文件,包含文件名列表“abc acc ...”。
      &lt; 是重定向 - 所以我们从文件 'list' 中读取,与 $(cat list) 相同。如果文件未命名为“list”,只需替换名称即可。
      file 在该语句中声明并迭代绑定到“list”中的所有条目。后来它被用作${file}。
      [ ! -f ${file}xxx ]是一个测试,是否存在-f(ile),对于abc它搜索文件abcxxx。
      但 !否定搜索,因此如果不存在这样的文件,则调用echo ...。 "x:" 只是一个调试遗留物。

      我们可以改进那部分:

      for file in $(< list); 
      do 
         [ -f ${file}xxx ] || echo ${file}xxx
      done
      

      我们可以写成 'x OR y' 而不是 'NOT x AND y' - 含义相同,只是更短:文件确实存在或回显其名称。

      ||是短路或。

      【讨论】:

      • 你能澄清一下cmd吗?文件是变量吗?那么列表呢?它们都是我必须声明的变量吗?
      • 感谢澄清,我现在正在尝试运行代码,但它一直告诉我“在 toronto160_match_aginst_file.pl 第 1 行的循环变量上缺少 $”。另外,应该是for循环还是foreach循环?
      • ...against_file.pl?我们在谈论 Perl 吗?我写的是shellcode,确切地说是'Bash'。
      【解决方案3】:

      如果您可以安排文本文件将每个名称放在单独的行中,那么以下命令将满足您的需要:

      ls myfolder | grep -f mytextfile
      

      在文本文件的单独行中获取每个名称的一种方法是在vi 中编辑副本并发出命令:

      :%s/ /^V^M/g
      :wq
      

      ^V^M 表示先输入“control-v”,然后输入“control-m”)

      【讨论】:

      • 嗨佩里,谢谢你的回复,我试过你的 cmd,它说 -f 是 grep 的非法选项。
      • -f 选项不起作用,它表示这是一个非法选项。我可以用 ack 替换它并仍然达到相同的结果吗?
      • 您使用的是哪种 Linux? “-f”长期以来一直是一个 grep 选项!
      • 我不知道,我认为服务器可能已经禁用了它。
      • 旧版本的 unix 有一套 grep cmds; grep、egrep 和 fgrep(可能还有 1 或 2 个),它们被 GNU grep 替换为选项,即 grep -E 和 grep -?嗯,猜测-F。因此,如果 grep -f 不起作用,请尝试 fgrep -f srchTargfile。注意 fgrep -f .. 不会处理 srchtargFiile 中的任何正则表达式。 @Davy:所有这些都是很好的答案,请给他们投票,当你获得 15 个代表点时,请接受一个作为你的工作答案。祝你好运。
      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2016-11-17
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多