递归查找和打开文件

时间:2014-10-23 12:48:39

标签: bash shell unix

我想搜索所有子目录和文件,以查找具有特定扩展名的文件。当我找到带扩展名的文件时,我需要打开它,从文件中找到一个特定的字符串并将其存储在一个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脚本的新手。感谢。

1 个答案:

答案 0 :(得分:2)

find -name "*.ext" \! -path './ExcludeThis*' -exec head -q '{}' \+ | 
    grep search_string | cut -f2 -d'"' >> results.txt

find解释

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