Bash Shell按内容查找文件

Bash Shell按内容查找文件,你之前写了一份重要的信件,并将其保存为以 .txt 为扩展名的文本文件,但现在想不起文件名的其余部分了。除此之外,唯一记得的就是信件内容中用到过单词“portend”。那么该如何查找已知部分内容的文件呢?

解决方案

如果文件就在当前目录下,可以使用简单的 grep 命令。

grep -i portend *.txt

使用 -i 选项的话,grep 会忽略大小写。该命令可能尚不足以找到你想要的信件,但可以作为第一步。当然,如果认为信件可能在众多子目录中,可以尝试用下列命令查找当前目录下所有子目录中的所有文本文件。

grep -i portend */*.txt

说实话,搜索范围仍然不够全面。

如果还没找到,我们换用一个更完备的解决方案:find 命令。使用其 -exec 选项对满足谓词的文件执行命令。你可以按下列方式使用 grep 或其他实用工具。

find . -name '*.txt' -exec grep -Hi portend '{}' \;

讨论

我们用 -name '*.txt' 帮助减少搜索对象。任何此类测试都会有所帮助,因为要对找到的每个文件单独执行命令会带来时间和 CPU 处理成本。如果对文件日期(如 -mdate -5)有粗略印象,也可以将其加入 find 命令。

执行命令时,文件名会出现在 '{}' 所在的位置。\; 表示命令到此结束,以免还有更多谓词。花括号和分号都需要转义,因此我们分别用了单引号和反斜线。使用哪种转义方式并不重要,只要能避免 bash 误会即可。

在有些系统中,-H 选项会输出包含搜索内容的文件名。一般情况下,使用 grep 时,命令行上只指定一个文件名,因此 grep 也就不用显示该文件名,只输出匹配的文本行即可。因为现在要搜索多个文件,所以得知道对应的文件名。

如果你使用的 grep 版本不支持 -H 选项,只将 /dev/null 作为其中一个文件名在命令行上给出就行了。如果打开多个文件,grep 命令就会输出包含查找文本的文件名。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!