2011-07-30 34 views
1

我有一个匹配文件名称的小问题。使用Linux cmds匹配列表名称与一堆文件

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

我试图做到这一点在Perl,或者只是直线前进的Linux CMDS,但也已制定了对我非常好,因为我不熟悉其一。

因此,例如:文本文件包含

abc acc eee fff 

和文件夹将有abcXXX,accXXX,eeeXXX和fffXXX

我需要通过列表进行排序,找出一个人失踪。

THX 戴维

回答

0

如果能够安排的文本文件,有一个单独的行每个名字,那么下面的命令将做你需要的东西:

ls myfolder | grep -f mytextfile 

一个办法让每一个名字在文本文件中的单独一行将在vi编辑副本,并发出命令:

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

^V^M意味着如果在文件的内容搜索中键入 “控制-V”,然后 “CONTROL-M”)

+0

喜佩里,THX的答复,我想你的CMD和它说-f是grep的非法选项。 – Davy

+0

-f选项不起作用,它表示这是一个非法选项。我可以用ack替换它,仍然可以达到相同的结果吗? – Davy

+0

你在使用什么样的Linux? “-f”在很长一段时间内一直是grep的选择! – Perry

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

list是文件,包含文件名“abc acc ...”的列表。
<是重定向 - 所以我们从文件名单“,同为$(cat list)阅读。如果该文件未被命名为“列表”,则只需替换该名称即可。
file在该语句中声明并反复绑定到“list”中的所有条目。之后它被用作$ {file}。
[ ! -f ${file}xxx ]是一个试验,-f(ILE)是否存在,为ABC它搜寻SEARCH_TERM_EXAMPLES文件abcxxx。
但是!否定搜索,所以如果不存在这样的文件,则调用echo ...。 “x:”只是一个调试遗留物。

我们可以改善的部分:

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

,而不是“NOT X和Y”,我们可以写“X或Y” - 意思是一样的,只是短:该文件不存在或呼应其名称。

||是短路的。

+0

你能否澄清一下cmds?文件是一个变量?那么列表呢?他们都是我必须申报的变数吗? – Davy

+0

我已经在答案中完成了。 –

+0

thx澄清,我试图运行代码现在,但它不断告诉我“缺少$在循环变量toronto160_match_aginst_file.pl行1”。另外,它应该是一个for循环或foreach循环? – Davy

相关问题