首页 > 解决方案 > 查找在特定文件中找到文本的目录

问题描述

如何找到在特定文件中找到文本的目录?例如,我想获取“/var/www/”中包含文件中文本“foo-bundle”的所有composer.json目录。我有一个已经完成的命令:

find ./ -maxdepth 2 -type f -print | grep -i 'composer.json' | xargs grep -i '"foo-bundle"'

但是我想制作一个sh脚本来获取所有这些目录并用它们做事。任何想法?

标签: linuxsh

解决方案


您当前的命令几乎就在那里,而不是使用xargswith grep,让:

  1. 将 移动grep-exec
  2. 用于xargs将结果传递dirname给仅显示父文件夹
find ./ -maxdepth 2 -type f -exec grep -l "foo-bundle" {} /dev/null \; | xargs dirname

如果您只想搜索composer.json文件,我们可以包含如下-iname选项:

find ./ -maxdepth 2 -type f -iname '*composer.json' -exec grep -l "foo-bundle" {} /dev/null \; | xargs dirname

如果| xargs dirname没有提供足够的数据,我们可以扩展它,这样我们就可以循环find使用while read这样的结果:

find ./ -maxdepth 2 -type f -iname '*composer.json' -exec grep -l "foo-bundle" {} /dev/null \; | while read -r line ; do
    parent="$(dirname ${line%%:*})"
    echo "$parent"
done

我们可以使用 来搜索所有包含特定文本的文件

遍历每一行后,我们可以

  1. 去掉后面:获取文件路径
  2. 用于dirname获取父文件夹路径

考虑这个文件设置,/test/b/composer.json包含foo-bundle

➜  /tmp tree
.
├── test
│   ├── a
│   │   └── composer.json
│   └── b
│       └── composer.json
└── test.sh

运行以下命令时test.sh

#!/bin/bash

grep -rw '/tmp/test' --include '*composer.json' -e 'foo-bundle' | while read -r line ; do
    parent="$(dirname ${line%:*})"
    echo "$parent"
done

结果与预期的一样,文件夹的路径b

/tmp/test/b

推荐阅读