Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 递归查找并打开文件_Bash_Shell_Unix - Fatal编程技术网

Bash 递归查找并打开文件

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

我想搜索所有子目录和文件,以找到具有特定扩展名的文件。当我找到一个扩展名为的文件时,我需要打开它,从文件中找到一个特定的字符串,并将其存储在txt文件中

这是迄今为止我找到所有正确文件的方法:

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