pengembangan-web-mp-pd.com

Bagaimana cara saya menerjang secara rekursif?

Bagaimana cara grep secara rekursif semua direktori dan subdirektori?

find . | xargs grep "texthere" *
1532
wpiri
grep -r "texthere" .

Parameter pertama mewakili ekspresi reguler untuk dicari, sedangkan yang kedua mewakili direktori yang harus dicari. Dalam hal ini, . berarti direktori saat ini.

Catatan: Ini berfungsi untuk GNU grep, dan pada beberapa platform seperti Solaris Anda harus secara khusus menggunakan GNU grep sebagai lawan implementasi legacy. Untuk Solaris ini adalah perintah ggrep.

2304
Vinko Vrsalovic

Jika Anda tahu ekstensi atau pola file yang Anda inginkan, metode lain adalah dengan menggunakan opsi --include:

grep -r --include "*.txt" texthere .

Anda juga dapat menyebutkan file yang akan dikecualikan dengan --exclude.

Ag

Jika Anda sering mencari melalui kode, Ag (Pencari Perak) adalah alternatif yang jauh lebih cepat daripada grep, itu disesuaikan untuk mencari kode. Sebagai contoh, ini bersifat rekursif secara default dan secara otomatis mengabaikan file dan direktori yang tercantum dalam .gitignore, sehingga Anda tidak harus terus melewati opsi pengecualian rumit yang sama untuk mencari atau menemukan.

623
christangrant

Juga:

find ./ -type f -print0 | xargs -0 grep "foo"

tetapi grep -r adalah jawaban yang lebih baik.

120
Kurt

Sekarang saya selalu menggunakan (bahkan di Windows dengan GoW - Gnu di Windows ):

grep --include="*.xxx" -nRHI "my Text to grep" *

Itu termasuk opsi berikut:

--include=PATTERN

Berulang dalam direktori hanya mencari file yang cocok PATTERN.

-n, --line-number

Awali setiap baris output dengan nomor baris di dalam file inputnya.

(Catatan: phuclv menambahkan di komentar that -n banyak mengurangi kinerja jadi , jadi Anda mungkin ingin melewatkan opsi itu)

-R, -r, --recursive

Baca semua file di bawah setiap direktori, secara rekursif; ini setara dengan opsi -d recurse.

-H, --with-filename

Cetak nama file untuk setiap kecocokan.

-I     

Memproses file biner seolah-olah tidak mengandung data yang cocok;
ini setara dengan opsi --binary-files=without-match.

Dan saya dapat menambahkan 'i' (-nRHIi), jika saya ingin hasil case-insensitive.

Saya bisa mendapatkan:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...
107
VonC

Dalam sistem POSIX, Anda tidak menemukan parameter -r untuk grep dan grep -rn "stuff" . Anda tidak akan berjalan, tetapi jika Anda menggunakan perintah find ia akan:

find . -type f -exec grep -n "stuff" {} \; -print

Disetujui oleh Solaris dan HP-UX.

21
rook

globbing **

Menggunakan grep -r berfungsi, tetapi mungkin berlebihan, terutama dalam folder besar.

Untuk penggunaan yang lebih praktis, inilah sintaks yang menggunakan sintaks globbing (**):

grep "texthere" **/*.txt

yang hanya menangkap file tertentu dengan pola pola yang dipilih. Ini berfungsi untuk shell yang didukung seperti Bash +4 atau zsh .

Untuk mengaktifkan fitur ini, jalankan: shopt -s globstar.

Lihat juga: Bagaimana cara menemukan semua file yang mengandung teks tertentu di Linux?

git grep

Untuk proyek-proyek di bawah kendali versi Git, gunakan:

git grep "pattern"

yang jauh lebih cepat.

ripgrep

Untuk proyek yang lebih besar, alat grepping tercepat adalah ripgrep yang menggeretakkan file secara rekursif secara default:

rg "pattern" .

Itu dibangun di atas mesin regex Rust yang menggunakan automata terbatas, SIMD dan optimasi literal agresif untuk membuat pencarian sangat cepat. Periksa analisis terperinci di sini .

16
kenorb

Untuk menemukan nama files dengan path secara rekursif yang mengandung string tertentu gunakan perintah di bawah ini untuk UNIX:

find . | xargs grep "searched-string"

untuk Linux:

grep -r "searched-string" .

menemukan file di server UNIX

find . -type f -name file_name

cari file di server LINUX

find . -name file_name
11

hanya nama file yang bisa bermanfaat juga

grep -r -l "foo" .
10
chim

Jika Anda hanya ingin mengikuti direktori aktual, dan bukan tautan simbolik,

grep -r "thingToBeFound" directory

Jika Anda ingin mengikuti tautan simbolik serta direktori aktual (hati-hati terhadap rekursi tak terbatas),

grep -R "thing to be found" directory

Karena Anda mencoba untuk menerjang secara rekursif, opsi berikut ini mungkin juga berguna bagi Anda:

-H: outputs the filename with the line

-n: outputs the line number in the file

Jadi jika Anda ingin menemukan semua file yang mengandung Darth Vader di direktori saat ini atau subdirektori apa pun dan menangkap nama file dan nomor baris, tetapi tidak ingin rekursi mengikuti tautan simbolik, perintahnya adalah

grep -rnH "Darth Vader" .

Jika Anda ingin menemukan semua sebutan kucing Word di direktori

/home/adam/Desktop/TomAndJerry 

dan Anda saat ini berada di direktori

/home/adam/Desktop/WorldDominationPlot

dan Anda ingin mengambil nama file tetapi bukan nomor baris dari sembarang string "kucing", dan Anda ingin rekursi mengikuti tautan simbolis jika menemukannya, Anda bisa menjalankan salah satu dari berikut ini

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

Sumber:

menjalankan "grep --help"

Pengantar singkat untuk tautan simbolik, bagi siapa pun yang membaca jawaban ini dan bingung dengan referensi saya kepada mereka: https://www.nixtutor.com/freebsd/understanding-symbolic-links/

9
SarcasticSully

ag adalah cara favorit saya untuk melakukan ini sekarang github.com/ggreer/the_silver_searcher . Ini pada dasarnya hal yang sama dengan ACK tetapi dengan beberapa optimasi lagi.

Inilah patokan singkat. Saya menghapus cache sebelum setiap pengujian (cf https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache )

[email protected]$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
[email protected]:$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
[email protected]$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
[email protected]$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s
8
dranxo

Ini adalah yang bekerja untuk kasus saya di mesin saya saat ini (git bash di windows 7):

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

Saya selalu lupa -print0 dan -0 untuk path dengan spasi.

EDIT: Alat pilihan saya sekarang bukan ripgrep: https://github.com/BurntSushi/ripgrep/releases Ini sangat cepat dan memiliki standar yang lebih baik (seperti rekursif secara default). Contoh yang sama dengan jawaban asli saya tetapi menggunakan ripgrep: rg -g "*.cs" "content pattern"

6
arkod

Jika Anda mencari konten tertentu di semua file dari struktur direktori, Anda dapat menggunakan find karena lebih jelas apa yang Anda lakukan:

find -type f -exec grep -l "texthere" {} +

Perhatikan bahwa -l (huruf kecil L) menunjukkan nama file yang berisi teks. Hapus itu jika Anda ingin mencetak pertandingan itu sendiri. Atau gunakan -H untuk mendapatkan file bersama dengan pertandingan. Secara keseluruhan, alternatif lain adalah:

find -type f -exec grep -Hn "texthere" {} +

Di mana -n mencetak nomor baris.

6
fedorqui

Ini seharusnya bekerja:

grep -R "texthere" *
5
sumit kumar

grep -r "texthere" .(periode pemberitahuan di akhir)

(^ kredit: https://stackoverflow.com/a/1987928/1438029 )


Klarifikasi:

grep -r "texthere" / (grep secara rekursif semua direktori dan subdirektori)

grep -r "texthere" . (grep secara rekursif ini direktori dan subdirektori)

grep rekursif

grep [options] PATTERN [FILE...]

[pilihan]

-R, -r, --recursive

Baca semua file di bawah setiap direktori, secara rekursif.

Ini sama dengan opsi -d recurse atau --directories=recurse.

http://linuxcommand.org/man_pages/grep1.html

bantu grep

$ grep --help

$ grep --help |grep recursive
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive

Alternatif

ack ( http://beyondgrep.com/ )

ag ( http://github.com/ggreer/the_silver_searcher )

4
Geoffrey Hale

Di IBM AIX Server saya (versi OS: AIX 5.2), gunakan:

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

ini akan mencetak path/nama file dan nomor baris relatif dalam file seperti:

./inc/xxxx_x.h

2865:/** Keterangan: stringYouWannaFind * /

bagaimanapun, ini bekerja untuk saya :)

3
user3606336

Di bawah ini adalah perintah untuk mencari String secara rekursif pada Unix dan Linux.

untuk perintah UNIX adalah:

find . -name "string to be searched" -exec grep "text" "{}" \;

untuk perintah Linux adalah:

grep -r "string to be searched" .

Saya kira inilah yang ingin Anda tulis

grep myText $(find .)

dan ini mungkin sesuatu yang berguna jika Anda ingin menemukan file grep hit

grep myText $(find .) | cut -d : -f 1 | sort | uniq
2
Victor Faria

Pada 2018, Anda ingin menggunakan ripgrep atau the-silver-searcher karena mereka jauh lebih cepat daripada alternatifnya.

Berikut adalah direktori dengan 336 subdirektori tingkat pertama:

% find . -maxdepth 1 -type d | wc -l
     336

% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py'  1.24s user 2.23s system 283% cpu 1.222 total

% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$'  2.71s user 1.55s system 116% cpu 3.651 total

% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py'  1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs  6.65s user 0.49s system 32% cpu 22.164 total

Pada OSX, ini menginstal ripgrep: brew install ripgrep. Ini menginstal silver-searcher: brew install the_silver_searcher.

2
hughdbrown

Untuk daftar bendera yang tersedia:

grep --help 

Mengembalikan semua kecocokan untuk regexp texthere di direktori saat ini, dengan nomor baris yang sesuai:

grep -rn "texthere" .

Mengembalikan semua kecocokan untuk texthere , mulai dari direktori root, dengan nomor baris yang sesuai dan mengabaikan case:

grep -rni "texthere" /

Bendera yang digunakan di sini:

  • -r rekursif
  • -n nomor baris cetak dengan output
  • -i abaikan case
2
JSON C11

Perhatikan bahwa find . -type f | xargs grep whatever jenis solusi akan mengalami kesalahan "Daftar argumen sampai panjang" ketika ada terlalu banyak file yang cocok dengan find.

Taruhan terbaik adalah grep -r tetapi jika itu tidak tersedia, gunakan find . -type f -exec grep -H whatever {} \; sebagai gantinya.

1
m.thome

Hanya untuk bersenang-senang, pencarian cepat dan kotor file * .txt jika jawaban @christangrant terlalu banyak untuk diketik :-)

grep -r texthere .|grep .txt

1
PJ Brunet

Inilah fungsi rekursif (diuji ringan dengan bash dan sh) yang melintasi semua subfolder dari folder tertentu ($ 1) dan menggunakan pencarian grep untuk string yang diberikan ($ 3) dalam file yang diberikan ($ 2):

$ cat script.sh
#!/bin/sh

cd "$1"

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "$1" "$2"
        fi
    done

    if [ -f "$1" ]
    then
        grep -l "$2" "$PWD/$1"
    fi

    cd ..
}

loop "$2" "$3"

Menjalankannya dan contoh output:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename
0
James Brown