Saya tahu ini adalah utas lama, tetapi saya menemukannya dan berpikir saya akan membagikan metode saya yang menurut saya merupakan cara yang sangat cepat untuk digunakan find
untuk hanya menemukan file non-biner:
find . -type f -exec grep -Iq . {} \; -print
The -I
pilihan untuk grep mengatakan itu untuk segera mengabaikan file biner dan .
pilihan bersama dengan -q
akan membuatnya segera mencocokkan file teks sehingga berjalan sangat cepat. Anda dapat mengubah -print
menjadi -print0
untuk perpipaan menjadi an xargs -0
atau sesuatu jika Anda khawatir tentang spasi (terima kasih atas tipnya, @ lucas.werkmeister!)
Juga titik pertama hanya diperlukan untuk versi BSD tertentu find
seperti di OS X, tetapi tidak ada salahnya hanya menyimpannya di sana setiap saat jika Anda ingin memasukkannya ke dalam alias atau sesuatu.
EDIT : Seperti yang ditunjukkan @ruslan dengan benar, -and
dapat dihilangkan karena sudah tersirat.
find . -type f -exec grep -Il "" {} \;
.find -type f -exec grep -Iq . {} \; -and -print
yang memiliki keuntungan karena menyimpan filefind
; Anda dapat menggantinya-print
dengan yang lain-exec
yang hanya dijalankan untuk file teks. (Jika Anda membiarkangrep
mencetak nama file, Anda tidak akan dapat membedakan nama file dengan baris baru di dalamnya.)find . -type f -exec grep -Il . {} +
jauh lebih cepat. Kekurangannya adalah tidak dapat diperpanjang oleh yang lain-exec
seperti yang disarankan @ lucas.werkmeisterBerdasarkan pertanyaan SO ini :
grep -rIl "needle text" my_folder
sumber
-I
ini adalah penyelamat.Mengapa tidak berguna? Jika Anda perlu sering menggunakannya, dan tidak ingin mengetiknya setiap kali cukup tentukan fungsi bash untuknya:
taruh di Anda
.bashrc
dan kemudian jalankan saja:kapanpun kamu mau.
EDIT untuk mencerminkan edit OP:
jika Anda ingin memotong informasi pantomim, Anda bisa menambahkan tahap lebih lanjut ke saluran pipa yang menyaring informasi pantomim. Ini harus melakukan trik, dengan mengambil hanya apa yang datang sebelum
:
:cut -d':' -f1
:sumber
file
manual: "Pengguna bergantung pada mengetahui bahwa semua file yang dapat dibaca di direktori memiliki kata 'teks' yang dicetak."/proc/meminfo
,/proc/cpuinfo
dll. adalah file teks, tetapifile /proc/meminfo
bertuliskan/proc/meminfo: empty
. Saya bertanya-tanya apakah 'kosong' harus diuji selain 'teks', tetapi tidak yakin apakah juga jenis lain bisa melaporkan 'kosong'.Sayangnya ini tidak menghemat ruang. Menempatkan ini ke dalam skrip bash membuatnya sedikit lebih mudah.
Ini adalah ruang aman:
sumber
text.bin
? 2. Bagaimana jika nama file mengandung:
?Cara lain untuk melakukan ini:
Jika Anda ingin file kosong juga:
sumber
Bagaimana dengan ini:
Jika Anda menginginkan nama file tanpa jenis file, cukup tambahkan
sed
filter terakhir .Anda dapat memfilter jenis file yang tidak dibutuhkan dengan menambahkan lebih banyak
-e 'type'
opsi kegrep
perintah terakhir .EDIT:
Jika
xargs
versi Anda mendukung-d
opsi tersebut, perintah di atas menjadi lebih sederhana:sumber
Inilah cara saya melakukannya ...
1. buat skrip kecil untuk menguji apakah sebuah file berupa teks biasa dalam teks:
2. gunakan temukan seperti sebelumnya
sumber
== *"text"* ]]
?Saya memiliki dua masalah dengan jawaban histumness:
Ini hanya mencantumkan file teks. Itu tidak benar-benar mencari mereka seperti yang diminta. Untuk benar-benar menelusuri, gunakan
Ini memunculkan proses grep untuk setiap file, yang sangat lambat. Maka solusi yang lebih baik
atau sederhananya
Ini hanya membutuhkan 0,2 detik dibandingkan 4 detik untuk solusi di atas (2.5GB data / 7700 file), yaitu 20x lebih cepat .
Juga, tidak ada yang mengutip ag, Silver Searcher atau ack-grep sebagai alternatif. Jika salah satu dari ini tersedia, mereka adalah alternatif yang jauh lebih baik:
Sebagai catatan terakhir, waspadalah terhadap positif palsu (file biner diambil sebagai file teks). Saya sudah memiliki positif palsu menggunakan grep / ag / ack, jadi lebih baik daftarkan file yang cocok terlebih dahulu sebelum mengedit file.
sumber
Meskipun ini adalah pertanyaan lama, saya rasa info di bawah ini akan menambah kualitas jawaban di sini.
Saat mengabaikan file dengan bit set yang dapat dieksekusi , saya hanya menggunakan perintah ini:
Untuk mencegahnya masuk ke direktori lain secara rekursif:
Tidak perlu pipa untuk mencampur banyak perintah, cukup perintah pencarian biasa yang kuat .
Karena itu, saya harap ini bermanfaat bagi siapa saja.
sumber
Saya melakukannya dengan cara ini: 1) karena ada terlalu banyak file (~ 30k) untuk dicari, saya membuat daftar file teks setiap hari untuk digunakan melalui crontab menggunakan perintah di bawah ini:
2) buat fungsi di .bashrc:
Kemudian saya dapat menggunakan perintah di bawah ini untuk melakukan pencarian:
HTH :)
sumber
Saya lebih suka xargs
jika nama file Anda aneh cari menggunakan opsi -0:
sumber
grep eth0 $ (temukan / etc / -type f -exec file {} \; | egrep -i "text | ascii" | cut -d ':' -f1)
sumber
Berikut adalah versi yang disederhanakan dengan penjelasan tambahan untuk pemula seperti saya yang mencoba mempelajari cara meletakkan lebih dari satu perintah dalam satu baris.
Jika Anda menuliskan masalah dalam langkah-langkah, akan terlihat seperti ini:
Untuk mencapai hal ini, kita dapat menggunakan tiga UNIX perintah:
find
,file
, dangrep
.find
akan memeriksa setiap file di direktori.file
akan memberi kami jenis file. Dalam kasus kami, kami mencari pengembalian 'teks ASCII'grep
akan mencari kata kunci 'ASCII' pada keluaran darifile
Jadi bagaimana kita bisa merangkai ini menjadi satu baris? Ada banyak cara untuk melakukannya, tetapi menurut saya melakukannya dalam urutan kode semu adalah yang paling masuk akal (terutama bagi pemula seperti saya).
find ./ -exec file {} ";" | grep 'ASCII'
Terlihat rumit, tapi lumayan saat kita memecahnya:
find ./
= lihat semua file di direktori ini. Thefind
perintah print nama file dari file yang cocok dengan 'ekspresi', atau apa pun yang datang setelah jalan, yang dalam hal ini adalah direktori saat ini atau./
Hal terpenting untuk dipahami adalah bahwa segala sesuatu setelah bit pertama itu akan dievaluasi sebagai Benar atau Salah. Jika Benar, nama file akan dicetak. Jika tidak, maka perintah akan terus berlanjut.
-exec
= Bendera ini adalah opsi di dalam perintah find yang memungkinkan kita menggunakan hasil dari beberapa perintah lain sebagai ekspresi pencarian. Ini seperti memanggil suatu fungsi dalam suatu fungsi.file {}
= perintah dipanggil di dalamfind
. Thefile
perintah mengembalikan sebuah string yang memberitahu Anda filetype file. Secara teratur, itu akan terlihat seperti ini:file mytextfile.txt
. Dalam kasus kami, kami ingin itu menggunakan file apa pun yang sedang dilihat olehfind
perintah, jadi kami memasukkan tanda kurung kurawal{}
untuk bertindak sebagai variabel kosong, atau parameter. Dengan kata lain, kami hanya meminta sistem untuk mengeluarkan string untuk setiap file di direktori.";"
= ini diperlukan olehfind
dan merupakan tanda baca di akhir-exec
perintah kita . Lihat manual untuk 'temukan' untuk penjelasan lebih lanjut jika Anda membutuhkannya dengan menjalankanman find
.| grep 'ASCII'
=|
adalah pipa. Pipa mengambil keluaran dari apapun yang ada di kiri dan menggunakannya sebagai masukan untuk apapun yang ada di sebelah kanan. Ini mengambil output darifind
perintah (string yang merupakan jenis file dari satu file) dan mengujinya untuk melihat apakah itu berisi string'ASCII'
. Jika ya, hasilnya benar.SEKARANG, ekspresi di sebelah kanan
find ./
akan mengembalikan nilai benar saatgrep
perintah mengembalikan nilai benar. Voila.sumber
Jika Anda tertarik untuk menemukan jenis file apa pun berdasarkan byte ajaibnya menggunakan
file
utilitas mengagumkan yang dikombinasikan dengan kekuatanfind
, ini bisa berguna:Keluaran:
Legenda:
$
adalah shell prompt interaktif tempat kita memasukkan perintah kitaAnda dapat memodifikasi bagian setelah
&&
memanggil beberapa skrip lain atau melakukan beberapa hal lain secara inline juga, yaitu jika file itu berisi string yang diberikan, cat seluruh file atau cari string sekunder di dalamnya.Penjelasan:
find
item yang merupakan filexargs
umpan setiap item sebagai satu baris menjadi satu barisbash
perintah / skripfile
memeriksa jenis file dengan byte ajaib,grep
memeriksa apakah ASCII ada, jika demikian, kemudian setelah&&
perintah berikutnya dijalankan.find
mencetak hasilnull
terpisah, ini bagus untuk menghindari nama file dengan spasi dan meta-karakter di dalamnya.xargs
, menggunakan-0
opsi, membacanya secaranull
terpisah,-I @@
mengambil setiap record dan digunakan sebagai parameter posisi / args untuk skrip bash.--
untukbash
memastikan apa pun yang muncul setelahnya adalah argumen meskipun dimulai dengan-
like-c
yang dapat diartikan sebagai opsi bashJika Anda perlu mencari tipe selain ASCII, cukup ganti
grep ASCII
dengan tipe lain, sepertigrep "PDF document, version 1.4"
sumber
Gunakan perintah find untuk mendaftar semua file, gunakan perintah file untuk memverifikasi bahwa mereka adalah teks (bukan tar, key), terakhir gunakan perintah awk untuk memfilter dan mencetak hasilnya.
sumber
Bagaimana dengan ini
sumber
"needle text"
"needl text"
"needle text"
itu akan ditemukan