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


116

我想在硬盘上找到一个包含特定单词的文本文件。

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

Answers:


196

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

 grep -r word *

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


9
星号与隐藏文件不匹配。要搜索所有文件,您可以运行grep -r word .
伊恩·麦金农

如果从Shell脚本调用grep,则search关键字可能不会突出显示,但是该--color=auto标志可以解决该问题。
noobninja

67

安装gnome-search-tool。

sudo apt-get install gnome-search-tool

打开Search for files选择Select More Options


在此处输入图片说明


1
您必须重新启动操作系统才能使其正常工作吗?还是在12天内不起作用?
jcollum

您是否已完成安装部分?我很确定它必须可以工作,并且可以在13.04上运行。
铰链

which gnome-search-tool= /usr/bin/gnome-search-tool...但是当我在gnome中打开搜索选项(转到,搜索文件...)时,“选择更多选项”没有选择
jcollum 2013年

1
通过输入终端打开:gnome-search-tool我相信您会看到它。
铰链

您可以通过破折号“搜索文件”启动gnome-search-tool,因此不需要终端。
伯纳德·德科克

5

这是可用于搜索文件中特定文本字符串的各种方法的概述,并添加了一些选项,专门用于仅处理文本文件,而忽略二进制/应用程序文件。

但是,应该注意,搜索单词可能会有些复杂,因为大多数行匹配工具都会尝试在行中的任何位置查找单词。如果我们谈论的单词是字符串,它可能出现在行的开头或结尾,或者单独出现在行中,或者被空格和/或标点符号包围-那时我们将需要正则表达式,尤其是那些来自Perl。例如,在这里,我们可以使用-Pin grep来使用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 输出找到行的文件名
  • 与subshel​​l中其他命令结合的好方法,例如:

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

佩尔

#!/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脚本中的可怜人递归grep

这就是“打击方式”。不理想,安装grepperl安装后可能没有充分的理由使用它。

#!/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

问题很老...无论如何...当前(2016年)有一个名为tracker(您可以在ubuntu存储库中找到)的gnome应用程序,可以安装该应用程序来搜索文件内的文本(尝试过odt-ods-odp-pdf) 。该软件包随附要安装的其他4个软件包(tracker-extract,tracker-gui,tracker-miner-fs,tracker-utils)Namastè:)


跟踪器是很好的软件,但是它要求索引已经包含有关您感兴趣的文件的信息,以便通过搜索将其击中。它使用的资源比Recoll少,我不确定索引的大小。但是,如果您需要搜索带有特定文本的文件并希望使用gui进行搜索,那么gnome-search-tool可以解决该问题而无需索引。在以前的Ubuntu版本中,它是默认应用程序,我不知道为什么他们没有替换就删除了它。
Hatoru Hansou

2

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.