我想搜索所有子目录和文件,以查找具有特定扩展名的文件。当我找到带扩展名的文件时,我需要打开它,从文件中找到一个特定的字符串并将其存储在一个txt文件中。
这是我到目前为止找到所有正确文件的原因:
find . -name ".ext" ! -path './ExcludeThis*'
这就是我打开文件并获取所需文件的一部分并存储它的原因:
LINE=$(head .ext | grep search_string)
SUBSTR=$(echo $LINE | cut -f2 -d '"')
echo $SUBSTR >> results.txt
我正在为如何将2组合在一起而苦苦挣扎,我已经在'** / *'中查看了'f'然后在那里运行if语句以查看它是否与.ext匹配并删除了查找所有内容的必要性在一起,但** / *似乎只适用于目录,而不是文件。
我也非常感谢任何解决方案的分解,我是shell脚本的新手。感谢。
答案 0 :(得分:2)
find -name "*.ext" \! -path './ExcludeThis*' -exec head -q '{}' \+ |
grep search_string | cut -f2 -d'"' >> results.txt
find -name "*.ext" \! -path './ExcludeThis*' -exec head -q '{}' \+
对于匹配的每个文件名,执行head
(使用\+
,通过在末尾附加每个选定的文件名来构建命令行,因此命令的调用总数将远远小于匹配文件的数量)。
注意我已将.ext
替换为*.ext
(第一种方法只是将一个名为.ext
的文件称为数字),将!
替换为\!
(保护免受解释)由壳)。
head
选项-q
是必需的,因为该命令在与多个文件一起使用时会打印标题(在这种情况下,由于\+
)。
此外,如果没有给出路径,则采用默认值(.
)。即:find . -name
= find -name
。
<find ... -exec head> | grep search_string | cut -f2 -d'"' >> results.txt
head
为管道中的每个文件写入行(默认为10)时,grep
会读取它们。 grep
与其中某些匹配search_string
,请在下一个管道中写下这些行。 cut
获取每一行的第二个字段(由"
分隔)并将其附加到results.txt