如何仅提取包含指定字符串的文件名?批量查询场景解决方案
问题解决:批量查询字符串并提取符合条件的文件名(排除查询列表文件)
我有1000余个文件,同时有一个包含1000余条字符串的列表文件additional.txt,需要在指定目录/var/spool/torque/server_priv/accounting/的所有文件中查询这些字符串。要求仅记录包含任一目标字符串的文件名,并写入addonsE.txt文件。
已尝试的命令
我试过下面两条命令:
for f in `cat additional.txt`; do grep -rnw '/var/spool/torque/server_priv/accounting/' -e ${f} ; done > addonsE.txt for f in `cat additional.txt`; do grep -inr ${f} /var/spool/torque/server_priv/accounting/ ; done > addonsE.txt
不符合预期的输出
执行后返回了查询列表文件自身的匹配内容,不符合需求:
/var/spool/torque/server_priv/accounting/additional.txt:1:aadrah2 /var/spool/torque/server_priv/accounting/additional.txt:2:aahmed93 /var/spool/torque/server_priv/accounting/additional.txt:3:aaich2
解决方案
可以直接利用grep的批量匹配参数,同时排除查询列表文件,并且仅输出文件名,命令如下:
基础版本(非递归,仅查询指定目录下的文件)
grep -lFf additional.txt /var/spool/torque/server_priv/accounting/ --exclude=additional.txt > addonsE.txt
递归版本(查询目录及所有子目录下的文件)
grep -rlFf additional.txt /var/spool/torque/server_priv/accounting/ --exclude=additional.txt > addonsE.txt
参数说明
-l:仅输出匹配到的文件名,不显示具体匹配内容-F:将查询字符串作为固定文本处理(无正则特殊字符时,可大幅提升匹配效率)-f additional.txt:从指定文件中读取所有待匹配的字符串列表--exclude=additional.txt:排除查询列表文件本身,避免它被误匹配-r:递归遍历目标目录下的所有子目录文件
这种写法相比原循环命令效率更高——只需执行一次grep即可完成所有字符串的匹配,无需循环调用1000余次。
内容的提问来源于stack exchange,提问作者anikaM
相关产品推荐
相关产品推荐

