Linux find和grep命令在一起

use*_*574 27 bash grep find

我试图找到一个命令或创建一个Linux脚本,可以执行这两个命令并列出otuput

find . -name '*bills*' -print
Run Code Online (Sandbox Code Playgroud)

这会打印所有文件

./may/batch_bills_123.log
./april/batch_bills_456.log
..
Run Code Online (Sandbox Code Playgroud)

从这个结果我想做一个grep的单词我现在手动执行此操作

grep 'put' ./may/batch_bill_123.log 
Run Code Online (Sandbox Code Playgroud)

得到

sftp > put oldnet_1234.lst
Run Code Online (Sandbox Code Playgroud)

我希望得到文件名和它的匹配.

./may/batch_bills_123.log   sftp > put oldnet_1234.lst
..
..
and so on... 
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

BMW*_*BMW 41

您正在寻找-Hgnu grep中的选项.

find . -name '*bills*' -exec grep -H "put" {} \;
Run Code Online (Sandbox Code Playgroud)

这是解释

    -H, --with-filename
      Print the filename for each match.
Run Code Online (Sandbox Code Playgroud)


Rei*_*ase 27

既然问题更清楚了,你可以在一个做到这一点

grep -R --include "*bills*" "put" .
Run Code Online (Sandbox Code Playgroud)

带有相关标志

   -R, -r, --recursive
          Read  all  files  under  each  directory,  recursively;  this is
          equivalent to the -d recurse option.
   --include=GLOB
          Search only files whose base name matches GLOB  (using  wildcard
          matching as described under --exclude).
Run Code Online (Sandbox Code Playgroud)


Dal*_*lin 5

或者甚至更容易

grep -R put **/*bills*
Run Code Online (Sandbox Code Playgroud)

The ** glob syntax means "any depth of directories". It will work in Zsh, and I think recent versions of Bash too.

  • 根据您拥有的匹配文件数量,您可能会收到“zsh: argument list too long: grep” (2认同)

F. *_*ely 5

grep -l "$SEARCH_TEXT" $(find "$SEARCH_DIR" -name "$TARGET_FILE_NAME")
Run Code Online (Sandbox Code Playgroud)