Bagaimana saya bisa memahami hasil FIND menggunakan -EXEC dan masih menampilkan ke file?


64

Lebih baik jelaskan pada contoh.

Saya bisa:

find . -name "*.py" -type f > output.txt

Tetapi bagaimana saya bisa menyimpan output ke file yang sama untuk:

find . -name "*.py" -type f -exec grep "something" {} \

Saya tidak bisa begitu saja

find . -name "*.py" -type f -exec grep "something" {} \ > output.txt

Jawaban:


106

Jika saya memahami Anda dengan benar, inilah yang ingin Anda lakukan:

find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt

Findsemua file dengan ekstensi py, grephanya baris yang berisi somethingdan 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 grepeksekusi sebanyak yang findditemukan. Namun, jika Anda mengganti ;dengan a +, grepdipanggil dengan output dari finddigabungkan (hingga batas tertentu). Lihat pertanyaan Menggunakan titik koma (;) vs plus (+) dengan exec in find untuk informasi lebih lanjut tentang subjek.


16
Gunakan +alih-alih \;, itu akan meningkatkan waktu eksekusi secara signifikan (karena akan menggabungkan argumen sebelum eksekusi sampai ARG_MAX).
Chris Down

Sekarang saya mengerti kekuatan xargs! Terima kasih!
domih

5
Gunakan grep -Hjika Anda ingin memasukkan nama file file dalam output.
Steinar

18

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.

find . -name "*.py" -type f -exec grep "something" {} \; > output.txt

Jika Anda ingin setiap proses grepmenghasilkan output ke file yang berbeda, jalankan shell untuk menghitung nama file output dan lakukan pengalihan.

find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;

yang terakhir sangat bagus: D
bakytn

Untuk memperluas jawaban @gilles agar sedikit lebih informatif, terutama jika daftar file yang Anda hadapi besar, Anda dapat melaporkan nama file (jalur relatif) dari setiap file bersama dengan hasil yang diterima menggunakan ini : 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"
JJMpls

9

Sebagai catatan, grepmiliki --includedan --excludeargumen yang dapat Anda gunakan untuk memfilter file yang dicari:

grep -r --include="*.py" "something" > output.txt

2
Setidaknya GNU grepmelakukannya.
phk

2

Gunakan tee:

find . -name '*.py' | tee output.txt | xargs grep 'something'

Peringatan, adalah jika Anda memiliki file dengan karakter khusus (termasuk spasi) yang xargsdan greptidak akan bekerja dengan baik dengan ( a file.txtakan diartikan sebagai dua file, adan file.txt). Alternatif untuk itu adalah dengan menggunakan salah satu -xatau -print0, tetapi salah satu dari mereka akan mencemari Anda output.txt. The -xakan menggunakan \untuk melarikan diri karakter khusus tertentu dan ini akan berada di output.txt. The -print0akan menggunakan byte null sebagai pemisah lapangan (yang juga membutuhkan xargs -0) dan output.txtakan terlihat seperti satu baris yang berdekatan panjang teks.

Bagaimana Anda menangani (atau tidak) dengan ini terserah Anda.

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.