Bash 递归查找并打开文件
我想搜索所有子目录和文件,以找到具有特定扩展名的文件。当我找到一个扩展名为的文件时,我需要打开它,从文件中找到一个特定的字符串,并将其存储在txt文件中 这是迄今为止我找到所有正确文件的方法:Bash 递归查找并打开文件,bash,shell,unix,Bash,Shell,Unix,我想搜索所有子目录和文件,以找到具有特定扩展名的文件。当我找到一个扩展名为的文件时,我需要打开它,从文件中找到一个特定的字符串,并将其存储在txt文件中 这是迄今为止我找到所有正确文件的方法: find . -name ".ext" ! -path './ExcludeThis*' 这是我打开文件、获取所需文件部分并将其存储的功能: LINE=$(head .ext | grep search_string) SUBSTR=$(echo $LINE | cut -f2 -d '"') echo
find . -name ".ext" ! -path './ExcludeThis*'
这是我打开文件、获取所需文件部分并将其存储的功能:
LINE=$(head .ext | grep search_string)
SUBSTR=$(echo $LINE | cut -f2 -d '"')
echo $SUBSTR >> results.txt
我正在努力研究如何将这两个函数组合在一起,我已经查看了**/*中的“for f”,然后在其中运行一个if语句,看看它是否与.ext匹配,并且不再需要一起查找,但是**/*似乎只对目录而不是文件起作用
任何解决方案的分解也将非常感谢,我对shell脚本还不熟悉。谢谢
find -name "*.ext" \! -path './ExcludeThis*' -exec head -q '{}' \+ |
grep search_string | cut -f2 -d'"' >> results.txt
解释 对于每个匹配的文件名,执行
head
(对于\+
,命令行是通过在末尾追加每个选定的文件名来构建的,因此命令调用的总数将远小于匹配的文件数)
请注意,我将.ext
替换为*.ext
(第一种方法就是对一个名为.ext
的文件进行数学运算)和代码>与\代码>(防止外壳解释)
选项-q
是必需的,因为该命令在与多个文件一起使用时会打印标题(在这种情况下是由于\+
)
此外,如果没有给出路径,则采用默认路径(
)。i、 e.:find-名称
=查找-名称
管道解释
| grep search|u string | cut-f2-d'>>results.txt
- 当
head
为管道中的每个文件写入行(默认为10行)时,grep
读取它们
- 如果
grep
与其中一些匹配search\u string
,请在下一个管道中写入这些行
- 同时,
cut
获取每行的第二个字段(由“
分隔),并将它们附加到results.txt
***
应该可以。。。您是否启用了globstar
?(即shopt-s globstar
)没有理由将第二位分解为三个这样的语句。一条管道就行了读取文件名时;执行grep搜索_string$filename |剪切…>>results.txt;done@mpez0,…使用有趣的文件名(名称、空格或通配符表达式等中带有反斜杠转义序列的文件名)需要更加偏执。@CharlesDuffy您的观点非常正确,但对于“不熟悉shell脚本”的OP,他们增加了理解基本脚本的复杂性这对我来说很有效,需要根访问权限,正如它所说的:查找“head”被信号13终止。也谢谢你的崩溃,它为我解释了一切
find -name "*.ext" \! -path './ExcludeThis*' -exec head -q '{}' \+
<find ... -exec head> | grep search_string | cut -f2 -d'"' >> results.txt