使用linux命令将列表名称与一堆文件进行匹配

时间:2011-07-30 22:18:01

标签: linux file command-line matching

我在匹配文件名时遇到了一些问题。

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

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

所以例如:文本文件包含

abc acc eee fff

该文件夹将包含abcXXX,accXXX,eeeXXX和fffXXX

我需要对列表进行排序,找出哪一个缺失。

THX 戴维

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

for file in $(< list); 
do 
   [ ! -f ${file}xxx ] && echo "x: " ${file}xxx
done

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

我们可以改进这一部分:

echo ...

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

||是短路的。

答案 2 :(得分:0)

如果您可以安排文本文件将每个名称放在一个单独的行上,那么以下命令将执行您所需的操作:

ls myfolder | grep -f mytextfile

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

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

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