web-dev-qa-db-ja.com

(名前ではなく)内部に特定のWordを含むテキストファイルを見つける方法

特定のWordを含むテキストファイルをハードディスクで検索したい。

Ubuntu 12.4以前は、ダッシュアプ​​リケーションで起動していましたが、それは「ファイルの検索...」と呼ばれていました。そのアイコンは虫眼鏡でした。その単純なアプリケーションはもう見つかりません。

114
SomeoneMe

ターミナルからgrepコマンドを使用できます。

 grep -r Word *

このコマンドは、現在のディレクトリ(またはサブディレクトリ)の下にあるすべてのファイルで「Word」のすべての出現箇所を検索します。

192
Steve Chapel

Gnome-search-toolをインストールします。

Sudo apt-get install gnome-search-tool

Search for filesを選択してSelect More Optionsを選択し、


enter image description here
67
hingev

特定のテキスト文字列のファイルを検索するために使用できるさまざまな方法の概要を次に示します。テキストファイルのみで動作し、バイナリ/アプリケーションファイルを無視するための特別なオプションがいくつか追加されています。

ただし、ほとんどの行マッチングツールは行のどこでもWordを見つけようとするため、Wordの検索は少し複雑になる可能性があることに注意してください。行の先頭または末尾に表示される、または行に単独で表示される、またはスペースや句読点に囲まれた文字列としてのWordについて話している場合-正規表現、特に来るものが必要な場合Perlから。ここで、たとえば、grep-Pを使用して、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は、行が見つかったファイル名を出力します
  • 次のようなサブシェル内の他のコマンドと組み合わせるための優れたアプローチ:

    $ 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スクリプトでの貧乏人の再帰grep

これが「bash way」です。 grepまたは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 "$@"
5

質問はかなり古い...とにかく...現在(2016)ファイル内のテキストを検索するためにインストールできるtracker(ubuntuリポジトリで見つけることができる)と呼ばれるgnomeアプリがあります(odt-odsを試しました) -odp-pdf)。このパッケージには、インストールする他の4つのパッケージ(tracker-extract、tracker-gui、tracker-miner-fs、tracker-utils)が含まれています。

4
cico

はい、あなたはGUIアプリケーションを探していたことがわかります。これは古い投稿ですが、これは誰かを助けるかもしれません。 ack-grep utilを見つけました。最初にSudo apt-get install ack-grep経由でインストールしてから、検索するディレクトリでコマンドack-grep what_you_looking_forを実行します。これにより、テキストが含まれるすべてのファイルが表示され、このファイルのプレビューも表示されます。そして、これは私にとってとても重要です。

2
spajdo

「シルバーサーチャー」Sudo apt-get install silversearcher-agは、さらにシンプルで高速です。 https://github.com/ggreer/the_silver_searcher をご覧ください。特にack *よりも優れている理由についての理由があります。