Cách tìm tệp văn bản chứa một từ cụ thể bên trong (không phải trong tên của nó)


117

Tôi muốn tìm một tệp văn bản trong đĩa cứng chứa một từ cụ thể.

Trước Ubuntu 12.4, tôi đã từng bắt đầu sử dụng một ứng dụng, tôi nghĩ rằng nó có tên là "Tìm kiếm tệp ...", có biểu tượng là kính lúp. Tôi không thể tìm thấy ứng dụng đơn giản đó nữa.

Câu trả lời:


198

Bạn có thể sử dụng greplệnh từ thiết bị đầu cuối:

 grep -r word *

Lệnh này sẽ tìm thấy tất cả các lần xuất hiện của "từ" trong tất cả các tệp trong thư mục hiện tại (hoặc thư mục con).


9
Dấu hoa thị không khớp với các tập tin ẩn. Để tìm kiếm tất cả các tập tin bạn có thể chạy grep -r word ..
Ian Mackinnon

nếu grep được gọi từ tập lệnh shell, thì từ khóa tìm kiếm có thể không được tô sáng, nhưng --color=autocờ có thể giải quyết điều đó.
noobninja

67

Cài đặt công cụ tìm kiếm gnome.

sudo apt-get install gnome-search-tool

Mở Search for fileschọn Select More Options


nhập mô tả hình ảnh ở đây


1
Bạn có phải khởi động lại hệ điều hành để làm việc này không? hoặc có thể nó không hoạt động trong 12?
jcollum

bạn đã cài đặt xong chưa? Tôi khá chắc chắn rằng nó phải hoạt động, nó hoạt động vào ngày 13.04.
lề

which gnome-search-tool= /usr/bin/gnome-search-tool... nhưng khi tôi mở tùy chọn tìm kiếm trong gnome (Đi, Tìm kiếm tệp ...) không có tùy chọn nào cho "Chọn tùy chọn khác"
jcollum

1
mở bằng cách gõ vào terminal: gnome-search-toolvà tôi chắc chắn bạn sẽ thấy nó.
hingev

Bạn có thể khởi chạy công cụ tìm kiếm gnome thông qua dấu gạch ngang "Tìm kiếm tệp", vì vậy bạn không cần thiết bị đầu cuối.
Bernard Decock

6

Dưới đây là tổng quan về các phương pháp khác nhau mà người ta có thể sử dụng để tìm kiếm tệp cho các chuỗi văn bản cụ thể, với một vài tùy chọn được thêm cụ thể để chỉ hoạt động với tệp văn bản và bỏ qua tệp nhị phân / ứng dụng.

Tuy nhiên, bạn cần lưu ý rằng việc tìm kiếm từ có thể hơi phức tạp, bởi vì hầu hết các công cụ khớp dòng sẽ cố gắng tìm một từ ở bất cứ đâu trên dòng. Nếu chúng ta đang nói về một từ dưới dạng chuỗi có thể xuất hiện ở đầu hoặc cuối dòng hoặc một mình trên dòng hoặc được bao quanh bởi khoảng trắng và / hoặc dấu chấm câu - đó là khi chúng ta cần các cụm từ thông dụng và đặc biệt là những từ xuất hiện từ Perl. Ở đây, ví dụ, chúng ta có thể sử dụng -Ptrong grepđể tận dụng Perl biểu thức thông thường để bao quanh nó.

$ 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 đơn giản

$ grep -rIH  'word'
  • -r cho tìm kiếm đệ quy từ thư mục hiện tại
  • -I bỏ qua các tập tin nhị phân
  • -H để xuất tên tệp nơi tìm thấy kết quả khớp

Chỉ thích hợp để tìm kiếm.

tìm + grep

$ find -type f -exec grep -IH 'word' {} \;
  • find phần tìm kiếm đệ quy
  • -I tùy chọn là bỏ qua các tệp nhị phân
  • -H để xuất tên tệp nơi tìm thấy dòng
  • cách tiếp cận tốt để kết hợp với các lệnh khác trong subshell, như:

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

người nghèo grep đệ quy trong kịch bản bash đệ quy

Đây là "cách bash". Không lý tưởng, có lẽ không có lý do chính đáng để sử dụng điều này khi bạn có grephoặc perlcài đặt.

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

Câu hỏi khá cũ ... dù sao ... hiện tại (2016) có một ứng dụng gnome được gọi là tracker(bạn có thể tìm thấy nó trong kho ubfox) có thể được cài đặt để tìm kiếm văn bản bên trong các tệp (đã thử odt-ods-odp-pdf) . Gói đi kèm với 4 gói khác sẽ được cài đặt (tracker-extract, tracker-gui, tracker-miner-fs, tracker-utils) Namastè :)


Tracker là phần mềm tốt nhưng nó yêu cầu chỉ mục phải chứa thông tin về tệp bạn quan tâm để tìm kiếm nó. Nó sử dụng ít tài nguyên hơn Recoll, tôi không chắc về kích thước chỉ mục. Nhưng nếu bạn đang cần tìm kiếm một tập tin với một văn bản cụ thể và muốn làm điều đó với gui, gnome-search-tool sẽ giải quyết vấn đề mà không cần chỉ mục. Đó là một ứng dụng mặc định trong các phiên bản Ubuntu trước đây, tôi không biết tại sao họ lại gỡ bỏ nó mà không cần thay thế.
Hatoru Hansou

2

Vâng, tôi biết bạn đang tìm kiếm ứng dụng gui và đây là bài viết cũ, nhưng có lẽ điều này giúp được ai đó. Tôi tìm thấy ack-grep sử dụng. Đầu tiên cài đặt nó thông qua sudo apt-get install ack-grepvà sau đó chạy lệnh ack-grep what_you_looking_fortrong thư mục mà bạn muốn tìm kiếm. Điều này cho bạn thấy tất cả các tệp trong đó là văn bản của bạn và cũng hiển thị xem trước từ các tệp này. Và điều này rất quan trọng đối với tôi.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.