Lompat ke konten utama

Penyusun Perintah find & grep

Urutan argumen find menentukan, dan tidak ada peringatan bila salah

Susun perintah find menurut nama, umur, ukuran, dan kedalaman, atau grep untuk mencari teks di dalam file. Perintah tanpa aksi selalu keluar lebih dulu, dan urutan argumen disusun supaya filter mendahului aksi.


Akan dikutip otomatis — itu penting, alasannya di output.
0 = tanpa batas.
hari
0 = abaikan.
MB
0 = abaikan.
Dipakai hanya bila aksinya "jalankan perintah".
Jauh lebih cepat; tidak semua perintah menerimanya.

Pada mode find dengan aksi hapus atau jalankan perintah, perintah tanpa aksi selalu keluar lebih dulu. Jalankan yang itu dan baca daftarnya; find tidak pernah menanyakan konfirmasi.

Seluruh perhitungan berjalan di browser Anda. Alamat IP, nama interface, dan password yang Anda masukkan tidak pernah dikirim ke server CoreNet.

Yang disusun

Dua perintah dalam satu halaman, karena keduanya menjawab pertanyaan yang sama — file mana — dan yang datang mencari salah satunya biasanya membutuhkan yang lain pada menit berikutnya.

  • find — cari file menurut nama, umur, ukuran, jenis, dan kedalaman; lalu tampilkan, hapus, atau jalankan perintah atasnya.
  • grep — cari teks di dalam file, rekursif, dengan pengecualian folder yang benar.

Pada mode find dengan aksi yang mengubah sesuatu, perintah tanpa aksi selalu keluar lebih dulu. find tidak pernah menanyakan konfirmasi.

Satu urutan argumen yang menghapus seluruh folder

Ini alasan sebenarnya tool ini ada, dan hal paling penting di halaman ini.

find . -name "*.log" -delete     ← menghapus file log
find . -delete -name "*.log"     ← menghapus SEMUANYA

Perintah kedua sah, berjalan tanpa satu pun error, dan mengosongkan folder beserta seluruh isinya.

Sebabnya: find menilai argumennya berurutan untuk setiap file yang ditemuinya. Pada perintah kedua, -delete dinilai lebih dulu — filenya dihapus — dan -name tidak pernah sempat menyaring apa pun.

Tidak ada peringatan. Tidak ada konfirmasi. Tidak ada yang dapat dibatalkan.

Tool ini selalu menyusun urutannya sendiri sehingga seluruh filter mendahului aksi. Bila kelak Anda menulisnya sendiri, itu satu-satunya urutan yang aman.

{} + lawan {} \; — sepuluh menit lawan dua detik

Pada -exec, tanda penutupnya menentukan berapa kali perintahnya dijalankan.

\; menjalankan perintah sekali per file. Pada sepuluh ribu file, itu sepuluh ribu proses yang harus dibuat dan dibersihkan sistem satu per satu.

+ mengumpulkan sebanyak mungkin file ke dalam satu pemanggilan. Bedanya bukan sedikit — pada pembersihan log yang biasa, ia sering dari beberapa menit menjadi kurang dari sedetik.

Tidak semua perintah menerima +. Yang hanya bisa satu file per panggilan — mv file tujuan, misalnya — harus memakai \;. Bila outputnya terlihat salah dengan +, itu sebabnya.

Dan titik komanya wajib di-escape menjadi \;, karena shell memakannya lebih dulu sebagai pemisah perintah. Itu sebab paling sering -exec "tidak jalan".

Pola nama wajib dikutip

find . -name "*.log"     ← benar
find . -name *.log       ← shell yang memperluas, bukan find

Tanpa kutip, shell memperluas *.log lebih dulu menjadi daftar file di folder saat ini, lalu menyerahkan daftar itu ke find sebagai argumen. Hasilnya bisa error, bisa juga jawaban yang salah tanpa terlihat salah — dan perilakunya berubah tergantung isi folder tempat Anda berdiri saat menjalankannya.

Tool ini selalu mengutipnya.

-maxdepth harus paling depan

-maxdepth adalah opsi, bukan uji, dan GNU find menuntutnya mendahului seluruh uji lain. Bila ditaruh sesudahnya ia tetap jalan tetapi mengeluarkan peringatan, dan perilakunya tidak seperti yang orang harapkan.

Berguna lebih sering daripada yang orang sadari: -maxdepth 1 membuat find berlaku seperti ls yang pandai — tanpa menelusuri ribuan file di bawahnya.

-- pada grep, dan pola yang berawalan tanda hubung

Tool ini selalu menyisipkan -- sebelum pola grep. Ia menandai akhir daftar opsi.

Tanpa itu, pola yang berawalan tanda hubung — -v, --color, atau potongan log yang kebetulan diawali - — ditafsirkan grep sebagai opsi, bukan sebagai yang dicari. Gejalanya perintah yang mengeluh tentang argumen yang tidak pernah Anda tulis.

-r tidak mengikuti link simbolik

Halus, dan penting pada server.

grep -r menelusuri subfolder tetapi tidak mengikuti link simbolik yang ditemukannya di dalamnya. Yang mengikuti adalah -R.

Pada folder berisi link ke tempat lain — /var/www yang menaut ke disk lain, misalnya — -R dapat menelusuri jauh lebih banyak daripada yang Anda kira, termasuk berputar. -r yang dipakai tool ini adalah pilihan yang benar untuk hampir semua orang.

Menyambung keduanya

Bila yang dicari hanya di dalam sejenis file tertentu, find yang memilih filenya dan grep yang membacanya:

find . -type f -name '*.php' -exec grep -Hn -- pola {} +

-H wajib di situ. Tanpa itu, saat find menyerahkan hanya satu file, grep tidak mencetak nama filenya — dan hasilnya menjadi baris tanpa asal yang tidak dapat ditindaklanjuti.

Pertanyaan yang sering diajukan

Kenapa -mtime +30 bukan "lebih dari 30 hari" secara persis? -mtime menghitung dalam satuan 24 jam penuh dan membuang sisanya. +30 berarti "umurnya 31 hari penuh atau lebih". Untuk pembersihan log, selisih satu hari itu tidak pernah menjadi masalah; untuk perhitungan yang tepat, -newermt yang benar.

Bisakah find mencari menurut isi file? Tidak — itu tugas grep. find menyaring menurut sifat filenya: nama, umur, ukuran, izin, pemilik.

Kenapa -delete menolak folder saya? -delete hanya membuang folder yang sudah kosong. Untuk membuang folder beserta isinya, pakai aksi "jalankan perintah" dengan rm -rf — dan jalankan versi tanpa aksinya dulu.

Apakah data saya dikirim ke server? Tidak. Seluruh penyusunan berjalan di browser Anda.