Bagaimana saya bisa menggunakan grep untuk mencari beberapa direktori yang tidak diuji?


21

Mungkin terdengar seperti saya menanyakan hal yang sama dengan pertanyaan ini , tetapi saya memiliki persyaratan yang berbeda. Ini adalah contoh dari sistem file saya:

  • /kode/
    • intern/
      • dev /
      • utama/
    • publik/
      • dev /
      • utama/
      • melepaskan/
    • alat /

/code/internal/dev/, /code/public/dev/dan /code/tools/berisi subdirektori untuk banyak proyek. Saya bekerja hampir secara eksklusif di cabang dev /code/internal/dan /code/public/, dan sering saya ingin mencari string teks di direktori tersebut bersama /code/tools/(yang tidak memiliki cabang). Dalam hal ini saya harus melakukan tiga perintah terpisah:

$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/

Saya ingin tahu apakah ada satu perintah untuk melakukan ini. Jika tidak, kemungkinan besar saya perlu menulis skrip bash sederhana.

Jawaban:


38

Anda dapat menggabungkan beberapa jalur untuk grep untuk dicari:

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/

Ini sangat jelas. Kenapa aku tidak memikirkan ini ?!
David Kennedy

Sebenarnya, ini melempar kesalahan grep: /code/internal/dev/*.cs: No such file or directorykecuali saya menghapus *.csdari perintah. Ini salah saya karena saya memasukkan *.cspertanyaan saya pada awalnya.
David Kennedy

14

Jika Anda ingin menggunakan wildcard secara maksimal (dan hierarki yang Anda poskan selesai), Anda bisa melakukannya

grep -r "some string" /code/{*/dev,tools}/*.cs

Penjelasan:

Langkah pertama yang dilakukan adalah perluasan daftar brace. foo{bar,baz}quxmeluas ke foobarqux foobazqux. Artinya, ada kata terpisah yang dihasilkan untuk setiap item yang dipisahkan koma dalam daftar, dengan bagian awalan dan postfix yang melekat pada masing-masing. Anda dapat melihat cara kerjanya dengan melakukan

echo A{1,2,3,4}B

output yang mana

A1B A2B A3B A4B

Perhatikan bahwa ini juga berfungsi dengan beberapa kawat gigi, dan juga dengan argumen kosong; sebagai contoh

echo {,1,2}{0,1,2}:{2,3}

memberi

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3

Jadi setelah penjepit ekspansi, perintah Anda terlihat seperti ini:

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs

Langkah selanjutnya adalah ekspansi wildcard. Anda sudah tahu itu untuk *.cssebagian, tetapi juga berfungsi untuk direktori perantara; apalagi, jika /diikuti, hanya direktori yang cocok. Karenanya dengan memberikan hierarki Anda (dan membuat nama file untuk .csfile), Anda akan mendapatkan perintah:

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs

Hanya setelah semua ini terjadi, grepdipanggil dengan daftar argumen ini (perhatikan bahwa hal yang sama terjadi dengan perintah asli Anda; grepjangan pernah melihat *; perluasan yang sepenuhnya dilakukan dengan bashsebelum memanggil grep).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.