我在匹配文件名时遇到了一些问题。
我有一个包含160个名字的文本文件。我有一个包含2000多个文件的文件夹。其中一些包含这160个名字。我正在寻找一个grep cmd,它可以获取文本文件中的每个名称,并尝试将其与文件夹的内容相匹配。
我正在尝试在perl中执行此操作,或者只是直接使用linux cmds,但这对我来说都不是很好,因为我对它们中的任何一个都不熟悉。
所以例如:文本文件包含
abc acc eee fff
该文件夹将包含abcXXX,accXXX,eeeXXX和fffXXX
我需要对列表进行排序,找出哪一个缺失。
THX 戴维
答案 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”)