如何在父目录和子目录中查找具有特定模式的文件?

如何在父目录和子目录中查找具有特定模式的文件?

如何使用单个命令在当前工作目录的父目录和子目录中查找具有特定模式的文件?

文件名 -测试.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默认情况下当仅提供单个文件可供使用时不显示文件名这一事实之外。

以下是解决此问题的两种方法:

  1. 使用grep具有非标准(但常见)选项的a-H来始终显示文件名:

    find ../ -type f -exec grep -H 'nslookup' {} \;
    
  2. grep至少给出两个文件名:

    find ../ -type f -exec grep 'nslookup' /dev/null {} \;
    

如果您有兴趣仅有的文件名,那么有两种方法可以做到这一点:

  1. 使用标准-l选项grep

    find ../ -type f -exec grep -l 'nslookup' {} \;
    
  2. 如果文件包含匹配项,则find输出文件的路径名:

    find ../ -type f -exec grep -q 'nslookup' {} \; -print
    

    在这里,我们仅用于grep检测模式是否匹配。它的-q选项阻止它输出任何内容,并将find使用实用程序的退出状态来确定是否执行该-print操作。

相关内容