如何使用单个命令在当前工作目录的父目录和子目录中查找具有特定模式的文件?
文件名 -测试.txt,该文件具有模式nslookup
该文件存在于 3 个目录中,它们是/家,/首页1和/首页/1/2
我目前在/首页1。我尝试过以下命令:
find ../ -type f -name "test.txt"
输出 :
../test.txt
../home/1/test.txt
../home/1/2/test.txt
我能够找到这些文件,因此我尝试了以下命令:
$ find ../ -type f -exec grep "nslookup" {} \;
nslookup
nslookup
nslookup
这不显示文件名。
命令 :
find . -type f -name "test.txt" | xargs grep "nslookup"
==> 给我 pwd 和子目录中的文件:
./1/test.txt:nslookup
./test.txt:nslookup
但是当我尝试在父目录中搜索时,如下所示,结果是错误的:
find ../ -type f -name "test.txt" | xargs grep "nslookup"
User@User-PC ~/test
$ uname -a
CYGWIN_NT-6.1 User-PC 2.5.2(0.297/5/3) 2016-06-23 14:29 x86_64 Cygwin
答案1
你的命令
find ../ -type f -exec grep "nslookup" {} \;
几乎是正确的,除了grep
默认情况下当仅提供单个文件可供使用时不显示文件名这一事实之外。
以下是解决此问题的两种方法:
使用
grep
具有非标准(但常见)选项的a-H
来始终显示文件名:find ../ -type f -exec grep -H 'nslookup' {} \;
grep
至少给出两个文件名:find ../ -type f -exec grep 'nslookup' /dev/null {} \;
如果您有兴趣仅有的文件名,那么有两种方法可以做到这一点:
使用标准
-l
选项grep
:find ../ -type f -exec grep -l 'nslookup' {} \;
如果文件包含匹配项,则
find
输出文件的路径名:find ../ -type f -exec grep -q 'nslookup' {} \; -print
在这里,我们仅用于
grep
检测模式是否匹配。它的-q
选项阻止它输出任何内容,并将find
使用实用程序的退出状态来确定是否执行该-print
操作。