Saya hanya akan melewati satu detik grep
untuk menghapusnya:
grep -r --exclude={\*~,\*.map} "OK" bar/ | grep -vP '(?<!debug)\.js'
The -v
membalikkan pertandingan, mencetak baris yang tidak cocok dengan pola dan -P
memungkinkan Perl Regular Expressions Kompatibel yang membiarkan kita menggunakan lookbehinds negatif . Regex khusus ini, akan cocok dengan .js
yang tidak diawali dengan debug
cara yang berarti (karena kami membalikkan pertandingan) bahwa hanya .js
file - file itu akan dicetak.
Namun, seperti yang ditunjukkan oleh @QuestionOverflow di dalam komentar, itu bisa memiliki efek samping yang tidak diinginkan dengan memfilter garis yang mengandung OK
dan js
karena grep -v
diterapkan pada seluruh output, bukan hanya nama file. Untuk menghindarinya, tambahkan saja titik dua (itulah yang grep
digunakan untuk memisahkan nama file dari konten file):
grep -r --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js:'
Itu masih akan gagal jika baris input Anda berisi foo.js:
atau jika nama file Anda berisi :
. Jadi, yang pasti, gunakan pendekatan yang berbeda:
grep -Tr --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js\t'
The -T
menyebabkan grep
untuk mencetak tab antara nama file dan isi file. Jadi, jika kita cukup menambahkan a \t
ke akhir regex, itu hanya akan cocok dengan nama file, dan bukan isi baris.
Namun, menggunakanfind
mungkin lebih masuk akal terlepas dari itu.
OK
dan.js
pada baris yang sama?find
mungkin lebih baik untuk hal semacam ini. Mendapatkan yang benargrep
bisa rumit seperti yang Anda tunjukkan :).failglob
opsi yang ditetapkan di shell:bash: no match: --exclude=*~
Anda perlu mengutip argumen pola GLOB Anda--exclude
untuk menyembunyikannya dari ekspansi shell, misalnya--exclude={\*~,\*.map}
Saya akan gunakan
find
untuk mencari file dan menyalurkan hasilnya melaluixargs
:Ini mencari setiap file yang tidak cocok dengan "
*~
", "*.map
" atau "*.js
tetapi tidak*.debug.js
".Menggunakan
find
Anda dapat dengan mudah mencari aturan yang agak rumit dan pendekatan ini menyelamatkan Anda dari penghapusan positif palsu secara tidak sengaja seperti yang dapat terjadi dengan gandagrep
.sumber
-exec grep OK {} +
alih-alihxargs
dan menghindari program tambahan.-exec +
tidak-exec \;
, yang akan menjalankan perintah sesedikit mungkin, sepertixargs
.Dengan
zsh
Anda dapat melakukan:Asalkan tentu saja daftar argumen tidak terlalu panjang, dalam hal ini Anda selalu dapat melakukannya:
sumber
zsh
-hanya:autoload zargs
danzargs some/dir/**/^(*~|*.map|(^*debug).js) -- grep OK
Jika Anda tidak keberatan melihat output sedikit rusak (jika Anda melakukannya, Anda dapat mengurutkannya):
Ini mensyaratkan bahwa shell Anda mendukung
**
untuk globbing rekursif: zsh tidak di luar kotak, bash tidak setelah Anda menjalankanshopt -s globstar
, ksh93 tidak setelah Anda menjalankanset -o globstar
.Tanpa
**
dukungan di shell, Anda dapat menggunakan dua perintah grep:sumber
**
, tetapi tampaknya ada sesuatu yang salah dengan argumen tambahan**/*.debug.js
, menyebabkan grep diartikanOK
sebagai direktori. Sudahkah Anda mencoba menjalankannya?Anda bisa menggunakannya
ripgrep
. Secara default ia mengabaikan file yang tersembunyi dan menghormati.gitignore
file Anda .Anda dapat menentukan aturan inklusi atau pengecualian dengan menggunakan parameter berikut:
Berikut adalah beberapa contoh sederhana:
Berikut adalah solusi lengkap untuk mengecualikan
*.~
,*.map
,*.js
, tapi tidak*.debug.js
:Pengujian:
sumber