วิธีค้นหาไฟล์ข้อความที่มีคำเฉพาะอยู่ข้างใน (ไม่อยู่ในชื่อ)


117

ฉันต้องการค้นหาไฟล์ข้อความในฮาร์ดดิสก์ซึ่งมีคำเฉพาะ

ก่อนหน้า Ubuntu 12.4 ฉันเคยเริ่มแอพพลิเคชั่นประฉันคิดว่ามันถูกเรียกว่า "ค้นหาไฟล์ ... " ซึ่งมีไอคอนเป็นแว่นขยายฉันไม่สามารถหาแอพพลิเคชั่นที่เรียบง่ายได้อีก

คำตอบ:


198

คุณสามารถใช้grepคำสั่งจากเทอร์มินัล:

 grep -r word *

คำสั่งนี้จะค้นหาคำว่า "word" ทั้งหมดในไฟล์ทั้งหมดภายใต้ไดเรกทอรีปัจจุบัน (หรือหน่วยย่อย)


9
เครื่องหมายดอกจันไม่ตรงกับไฟล์ที่ซ่อนอยู่ ในการค้นหาไฟล์ทั้งหมดที่คุณสามารถเรียกgrep -r word .ใช้ได้
Ian Mackinnon

หาก grep ถูกเรียกใช้จากเชลล์สคริปต์คำสำคัญในการค้นหาอาจไม่พิมพ์ไฮไลต์ แต่--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
hingev

which gnome-search-tool= /usr/bin/gnome-search-tool... แต่เมื่อฉันเปิดตัวเลือกการค้นหาเป็นคำพังเพย (ไปค้นหาไฟล์ ... ) ไม่มีตัวเลือกสำหรับ "เลือกตัวเลือกเพิ่มเติม"
jcollum

1
เปิดโดยการพิมพ์ใน terminal: gnome-search-toolและฉันแน่ใจว่าคุณจะเห็นมัน
hingev

คุณสามารถเรียกใช้ gnome-search-tool ผ่านทางเส้นประ "ค้นหาไฟล์" ดังนั้นคุณไม่จำเป็นต้องใช้เครื่องเทอร์มินัล
Bernard Decock

6

ต่อไปนี้เป็นภาพรวมของวิธีการต่าง ๆ ที่สามารถใช้ในการค้นหาไฟล์สำหรับสตริงข้อความที่ต้องการโดยมีตัวเลือกไม่กี่ตัวที่ถูกเพิ่มเข้ามาเพื่อทำงานกับไฟล์ข้อความเท่านั้นและไม่สนใจไฟล์ไบนารี / แอปพลิเคชัน

อย่างไรก็ตามสิ่งหนึ่งที่ควรทราบคือการค้นหาคำอาจมีความซับซ้อนเล็กน้อยเนื่องจากเครื่องมือจับคู่บรรทัดส่วนใหญ่จะพยายามค้นหาคำที่ใดก็ได้ในบรรทัด หากเรากำลังพูดถึงคำว่าสายอักขระที่อาจปรากฏในจุดเริ่มต้นหรือจุดสิ้นสุดของบรรทัดหรืออยู่คนเดียวในบรรทัดหรือล้อมรอบด้วยช่องว่างและ / หรือเครื่องหมายวรรคตอน - นั่นคือเมื่อเราต้องการการแสดงออกปกติและโดยเฉพาะอย่างยิ่งที่มา จาก Perl ตัวอย่างเช่นที่นี่เราสามารถใช้-Pใน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 ไปยังชื่อไฟล์เอาต์พุตที่พบบรรทัด
  • วิธีการที่ดีสำหรับการรวมกับคำสั่งอื่นภายใน subshell เช่น:

    $ 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 },".")

grep ที่ไม่ดีของมนุษย์เรียกซ้ำ grep ในสคริปต์ bash แบบเรียกซ้ำ

นี่คือ "วิธีทุบตี" ไม่เหมาะอาจไม่มีเหตุผลที่ดีที่จะใช้สิ่งนี้เมื่อคุณมี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 "$@"

4

คำถามค่อนข้างเก่า ... ต่อไป ... ปัจจุบัน (2016) มีแอป gnome ที่เรียกว่าtracker(คุณสามารถค้นหาได้ในที่เก็บ Ubuntu) ที่สามารถติดตั้งเพื่อค้นหาข้อความภายในไฟล์ (ลอง 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ในไดเรกทอรีที่คุณต้องการค้นหา นี่จะแสดงไฟล์ทั้งหมดที่เป็นข้อความของคุณและแสดงตัวอย่างจากไฟล์นี้ และนี่เป็นสิ่งสำคัญสำหรับฉัน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.