Saya mencoba menemukan semua file yang berjenis tertentu dan tidak mengandung string tertentu. Saya mencoba untuk menyelesaikannya dengan mem-piping find ke grep -v
contoh:
find -type f -name '*.java' | xargs grep -v "something something"
Ini sepertinya tidak berhasil. Tampaknya hanya mengembalikan semua file yang ditemukan oleh perintah find. Apa yang saya coba lakukan pada dasarnya adalah menemukan semua file .java yang cocok dengan nama file tertentu (mis. Diakhiri dengan 'Pb' seperti pada SessionPb.java) dan yang tidak memiliki 'extends SomethingSomething "di dalamnya.
Kecurigaan saya adalah saya melakukan kesalahan. Jadi bagaimana seharusnya perintah itu?
Jawaban:
Tidak perlu di
xargs
sini. Juga Anda perlu menggunakangrep
dengan-L
pilihan (file tanpa pertandingan), menyebabkan jika tidak maka akan menampilkan isi file bukan namanya, seperti dalam contoh Anda.sumber
-L
sudah melakukan negosiasi, karena itu artinyafiles _without_ match
. Karena itu Anda tidak perlu-v
opsi di sini.find -exec \+
seseorang menulis kepada saya bahwa jauh lebih baik menggunakan xargs. mengapa tidak ada yang terlihat seperti pria sebelum menulis komentar? (:-exec ... {} \+
tidak setara denganxargs
. Silakan baca dokumentasi findutils! (Saya bekerja cukup keras untuk itu!)xargs
memproses inputnya dan memisahkan argumen pada spasi putih. Kutipan juga spesial (secara default) untukxargs
. Tak satu pun dari hal-hal ini berlaku untuk-exec ... {} +
. Versi lama yangxargs
digunakan untuk mempertimbangkan garis bawah sebagai indikator EOF, tetapi ini bukan masalahnya lagi.Anda hampir mendapatkannya benar-benar ...
Titik '.' mengatakan mulai dari sini. (milikmu menyiratkannya .. tapi jangan pernah berasumsi).
-iname menggunakan pencarian case-insensitive, untuk jaga-jaga (atau hanya in-case).
-print0 mengirim nama file ke xargs dengan karakter trailing \ x00, yang mencegah masalah dengan nama file memiliki spasi di dalamnya.
'-0' pada xargs mengatakan mengharapkan nama file diakhiri dengan \ x00 alih-alih pengembalian.
dan perintah grep Anda ...
Cukup banyak mengerti.
EDIT ::
Dari pembaruan Anda:
harus membantu. (Ditambahkan -L dari jawaban @ rush, kerja bagus)
Saya mendapat ide bahwa grep Anda membutuhkan opsi '-i', atau menjadi kurang eksplisit.
Coba perintah di bagian ... apakah ini menghasilkan nama file yang tampaknya tepat?
Jika demikian, maka masalah Anda kemungkinan adalah pola pencarian grep Anda tidak cocok (kesalahan ejaan? Itu terjadi!), Atau tidak ada kecocokan.
Kasus terburuk absolut:
akan melakukan banyak pekerjaan BANYAK mencari semuanya, tetapi harus memberi Anda beberapa output.
sumber
xargs -0 grep -v "something something"
harusxargs -0 grep -v "something something" /dev/null
jika tidak, anda akan mendapatkan hasil yang aneh ketika menemukan tidak menghasilkan file yang cocok.Komputer menjadi komputer: komputer melakukan apa yang Anda perintahkan, bukan apa yang Anda inginkan.
grep -v "something something"
mencetak semua garis yang tidak mengandungsomething something
. Misalnya, ia mencetak dua baris di antara tiga berikut:Untuk mencetak file yang tidak mengandung di
extends SomethingSomething
mana pun, gunakan-L
opsi:Beberapa versi grep tidak memiliki
-L
opsi (tidak ditentukan oleh POSIX ). Jika milik Anda tidak, mintalah ia mencetak apa-apa, dan gunakan kode pengembalian untuk membuat shell panggilan melakukan apa pun yang seharusnya dilakukan.Atau, gunakan awk.
Di Linux atau Cygwin (atau sistem lain dengan GNU grep), Anda tidak perlu menggunakan
find
, karenagrep
mampu berulang.Jika shell Anda adalah ksh atau bash atau zsh, Anda dapat membuat shell melakukan pencocokan nama file. Pada bash, jalankan
set -o globstar
terlebih dahulu (Anda dapat menempatkan ini di Anda~/.bashrc
).sumber
\s
adalah ekstensi grep GNU, yang saya pikir identik dengan[[:space:]]
.