如何查找包含特定单词的文本文件(不在其名称中)

如何查找包含特定单词的文本文件(不在其名称中)

我想在硬盘中查找包含特定单词的文本文件。

在 Ubuntu 12.4 之前,我曾经在仪表盘中启动一个应用程序,我认为它被称为“搜索文件...”,它的图标是一个放大镜。我再也找不到那个简单的应用程序了。

答案1

您可以grep从终端使用以下命令:

 grep -r word *

此命令将在当前目录(或子目录)下的所有文件中查找所有出现的“word”。

答案2

安装 gnome-search-tool。

sudo apt-get install gnome-search-tool

打开Search for files选择Select More Options


在此处输入图片描述

答案3

这里概述了可用于在文件中搜索特定文本字符串的不同方法,其中专门添加了一些仅适用于文本文件而忽略二进制/应用程序文件的选项。

但是,需要注意的是,搜索单词可能会有点复杂,因为大多数行匹配工具都会尝试在行中的任何位置查找单词。如果我们要讨论的单词是字符串,可能出现在行首或行末,或单独出现在行中,或被空格和/或标点符号包围 - 这时我们就需要正则表达式,尤其是来自 Perl 的正则表达式。例如,在这里,我们可以使用-Pingrep来利用 Perl 正则表达式来包围它。

$ printf "A-well-a don't you know about the bird?\nWell, everybody knows that the bird is a word" | grep -noP '\bbird\b'                                               
1:bird
2:bird

简单的 grep

$ grep -rIH  'word'
  • -r从当前目录向下递归搜索
  • -I忽略二进制文件
  • -H输出匹配的文件名

仅适合搜索。

查找 + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find递归搜索部分
  • -I选项是忽略二进制文件
  • -H输出找到行的文件名
  • 与子 shell 中的其他命令结合的好方法,例如:

    $ find -type f -exec sh -c 'grep -IHq "word" "$1" && echo "Found in $1"' sh {} \;
    

Perl

#!/usr/bin/env perl
use File::Find;
use strict;
use warnings;

sub find_word{
    return unless -f;
    if (open(my $fh, $File::Find::name)){
        while(my $line = <$fh>){
            if ($line =~ /\bword\b/){
                printf "%s\n", $File::Find::name;
                close($fh);
                return;
            }
        }
    }
}

# this assumes we're going down from current working directory
find({ wanted => \&find_word, no_chdir => 1 },".")

递归 bash 脚本中的 poor-mans 递归 grep

grep这是“bash 方式”。并不理想,当您已经安装或拥有时,可能没有理由使用它perl

#!/usr/bin/env bash
shopt -s globstar
#set -x
grep_line(){
    # note that this is simple pattern matching 
    # If we wanted to search for whole words, we could use
    # word|word\ |\ word|\ word\ )
    # although when we consider punctuation characters as well - it gets more
    # complex
    case "$1" in
        *word*) printf "%s\n" "$2";;
    esac
}
readlines(){
    #  line count variable can be used to output on which line match occured

    #line_count=1
    while IFS= read -r line;
    do
        grep_line "$line" "$filename"
        #line_count=$(($line_count+1))
    done < "$1"
}

is_text_file(){
    # alternatively, mimetype command could be used
    # with *\ text\/* as pattern in case statement
    case "$(file -b --mime-type "$1")" in
        text\/*) return 0;;
        *) return 1;;
    esac
}

main(){
    for filename in ./**/*
    do
        if [ -f "$filename" ] && is_text_file "$filename"
        then
            readlines "$filename"
        fi
    done
}
main "$@"

答案4

是的,我知道你在寻找 GUI 应用程序,这是一篇旧帖子,但也许这对某些人有帮助。我找到了 ack-grep 实用程序。首先通过它安装,sudo apt-get install ack-grep然后ack-grep what_you_looking_for在要搜索的目录中运行命令。这会向你显示所有包含文本的文件,还会显示这些文件的预览。这对我来说非常重要。

相关内容