Jika saya memahami Anda dengan benar, inilah yang ingin Anda lakukan:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find
semua file dengan ekstensi py
, grep
hanya baris yang berisi something
dan menyimpan baris output.txt
. Jika file berisi apa pun itu akan diganti.
Edit: Menggunakan -exec:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
Saya memasukkan komentar Chris Downs di sini. Perintah di atas akan menghasilkan grep
eksekusi sebanyak yang find
ditemukan. Namun, jika Anda mengganti ;
dengan a +
, grep
dipanggil dengan output dari find
digabungkan (hingga batas tertentu). Lihat pertanyaan Menggunakan titik koma (;) vs plus (+) dengan exec in find untuk informasi lebih lanjut tentang subjek.
+
alih-alih\;
, itu akan meningkatkan waktu eksekusi secara signifikan (karena akan menggabungkan argumen sebelum eksekusi sampaiARG_MAX
).grep -H
jika Anda ingin memasukkan nama file file dalam output.Jika Anda ingin menyimpan semua baris yang cocok di semua file
output.txt
, perintah terakhir Anda berfungsi, kecuali bahwa Anda kehilangan yang diperlukan;
di akhir perintah.Jika Anda ingin setiap proses
grep
menghasilkan output ke file yang berbeda, jalankan shell untuk menghitung nama file output dan lakukan pengalihan.sumber
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
Dan jika Anda ingin melihat nomor baris dari garis yang Anda dapat, tentu saja, gunakangrep -n "something"
Sebagai catatan,
grep
miliki--include
dan--exclude
argumen yang dapat Anda gunakan untuk memfilter file yang dicari:sumber
grep
melakukannya.Gunakan
tee
:Peringatan, adalah jika Anda memiliki file dengan karakter khusus (termasuk spasi) yang
xargs
dangrep
tidak akan bekerja dengan baik dengan (a file.txt
akan diartikan sebagai dua file,a
danfile.txt
). Alternatif untuk itu adalah dengan menggunakan salah satu-x
atau-print0
, tetapi salah satu dari mereka akan mencemari Andaoutput.txt
. The-x
akan menggunakan\
untuk melarikan diri karakter khusus tertentu dan ini akan berada dioutput.txt
. The-print0
akan menggunakan byte null sebagai pemisah lapangan (yang juga membutuhkanxargs -0
) danoutput.txt
akan terlihat seperti satu baris yang berdekatan panjang teks.Bagaimana Anda menangani (atau tidak) dengan ini terserah Anda.
sumber