如何找到在特定文件中找到文本的目录?例:我想获得"/var/www/"中的所有目录。包含文字" food -bundle"在composer.json
文件中。我已经有一个这样的命令了:
find ./ -maxdepth 2 -type f -print | grep -i 'composer.json' | xargs grep -i '"foo-bundle"'
然而,我想做一个sh
脚本,得到所有这些目录和做的事情与他们。任何想法?
find
您当前的命令几乎在那里,而不是使用xargs
和grep
,让:
- 将
grep
移动到-exec
- 使用
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
不能提供足够的数据,我们可以扩展它,这样我们就可以使用while read
循环find
的结果,如下所示:
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
grep h1> 们可以使用grep来搜索包含特定文本的所有文件。
在每一行循环之后,我们可以
- 移除
:
后面获取文件路径 - 使用
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
要查找包含特定文本段的所有文件,可以使用:
find ./ -maxdepth 2 -type f -exec grep -l "composer.json" {} /dev/null ;
结果是一个文件名列表。现在您需要做的就是找到一种方法,在所有这些服务器上启动命令dirname
。(我尝试使用一个简单的管道,但这将是太容易了:-))
感谢@0stone0的引领。我终于得到了它:
#!/bin/sh
find /var/www -maxdepth 2 -type f -print | grep -i 'composer.json' | xargs grep -i 'foo-bundle' | while read -r line ; do
parent="$(dirname ${line%%:*})"
echo "$parent"
done