GNU/Linux >> Belajar Linux >  >> Linux

Panduan untuk Perintah "Temukan" Linux

Perintah find memungkinkan pengguna untuk mencari file dan mengambil tindakan terhadapnya. Ini adalah bagian dari paket "findutils" dan dibundel dengan semua distribusi. Ini sangat fleksibel, memungkinkan Anda untuk mencari file dan direktori berdasarkan berbagai kondisi. Opsional, ini juga memungkinkan Anda untuk mengambil berbagai jenis tindakan pada hasil.

Pada artikel ini, kita akan memahami cara bekerja dengan perintah find. Kami juga akan mengilustrasikan penggunaannya melalui berbagai contoh di seluruh artikel ini.

Pengantar

Struktur dasar dari perintah find adalah seperti ini:

find [paths] [expression] [actions]

Perintah find mengambil sejumlah jalur, dan mencari file dan direktori di setiap jalur "secara rekursif". Jadi, ketika perintah find menemukan direktori di dalam jalur yang diberikan, ia mencari file dan direktori lain di dalamnya. Sekali lagi, jika ada direktori lain di dalamnya, perintah find juga akan melihat ke dalamnya. Proses ini berlanjut hingga pencarian semua item di dalam jalur yang Anda tentukan.

Secara default, perintah find menemukan semua yang ada di dalam direktori. Jika Anda ingin memfilter beberapa di antaranya berdasarkan kriteria tertentu, Anda dapat menentukan ekspresi untuk melakukannya.

Tindakan default adalah mencetak semua hasil. Namun,  Anda juga dapat menentukan tindakan khusus yang dapat dilakukan perintah find pada hasil.

Konsep-konsep ini akan menjadi lebih jelas saat kita membahas berbagai contoh yang disebutkan nanti dalam artikel ini.

Menemukan semua file dan direktori

Bayangkan Anda ingin membuat daftar semua direktori dan file untuk jalur tertentu. Misalnya, jika Anda ingin mencantumkan konten /usr/share direktori, jalankan:

find /usr/share

Ini akan memberi Anda daftar file dan direktori, seperti yang ditunjukkan pada gambar di bawah. Tergantung pada isi direktori, daftar ini bisa sangat besar!

Jika Anda ingin membuat daftar isi dari beberapa direktori, Anda dapat melakukannya seperti ini:

find /usr/share /bin /usr/lib

Jika Anda ingin membuat daftar isi direktori kerja saat ini, gunakan titik (. ) sebagai jalur:

find .

Ketika tidak ada jalur, perintah find mengasumsikan bahwa itu harus bekerja dengan direktori saat ini. Jadi, Anda dapat meninggalkan . dan cukup gunakan:

find

Menemukan item berdasarkan namanya

Seperti yang kami sebutkan sebelumnya, Anda dapat memfilter hasil dari perintah find menggunakan ekspresi. Di bagian ini, kita akan mempelajari cara memfilter item berdasarkan namanya.



Jika Anda ingin mencari file atau direktori bernama NEWS.txt di dalam /usr direktori, gunakan -name beralih seperti ini:

find /usr -name NEWS.txt

-name sakelar peka huruf besar-kecil. Jika Anda tidak tahu persis kasus barang yang Anda cari, Anda dapat menggunakan -iname sakelar yang tidak peka huruf besar/kecil:

find /usr -iname news.txt

-name dan -iname switch juga menerima "wildcard", yang merupakan karakter khusus yang bertindak sebagai pengganti. Ada dua karakter pengganti — ? karakter mewakili satu karakter yang tidak diketahui, dan * karakter mewakili sejumlah karakter yang tidak diketahui (termasuk nol).

Jika Anda ingin menggunakan karakter wildcard, Anda harus menyimpan name /iname parameter di dalam tanda kutip tunggal atau ganda. Sejak * dan ? karakter juga merupakan karakter khusus untuk shell, menempatkannya dalam tanda kutip memastikan bahwa perintah bekerja dengan benar.

Sebagai contoh, jika Anda harus mencari semua file dan direktori di dalam /usr yang memiliki .txt di akhir namanya, Anda dapat menggunakan:

find /usr -name '*.txt'

Jika Anda ingin mencari file dan direktori dengan empat huruf di namanya, jalankan:

find /usr -name '????'

Terkadang, Anda mungkin ingin mencocokkan path lengkap ke file/direktori, daripada hanya mencocokkan namanya. Dalam situasi seperti itu, Anda dapat menggunakan -path mengalihkan. Sebagai contoh, katakanlah Anda ingin mencari semua file dan direktori dengan .txt di akhir nama mereka, tetapi hanya jika mereka berada di direktori bernama src . Jadi, di path lengkap, akan ada /src/ di suatu tempat di tengah, dan .txt pada akhirnya. Jadi, perintahnya adalah:

find /usr -path '*/src/*.txt'

Ada juga -ipath switch, yang merupakan versi -path yang tidak peka huruf besar-kecil .

Mencari file atau direktori

Semua contoh yang telah kita lihat sejauh ini mengembalikan file dan direktori. Namun, jika Anda hanya perlu mencari file atau direktori, Anda dapat menggunakan -type mengalihkan. Parameter paling umum dari -type adalah:

  • f :file
  • d :direktori
  • l : tautan simbolik

Misalnya, untuk menemukan semua file di /usr direktori, jalankan:

find /usr -type f

Anda juga dapat menggabungkan berbagai sakelar dari perintah find. Misalnya, untuk menemukan semua .txt file di /usr direktori, Anda dapat menggunakan:

find /usr -type f -name '*.txt'

Demikian pula, untuk menemukan direktori di dalam /usr yang dimulai dengan "python", gunakan:

find /usr -type d -name 'python*'

Menemukan file kosong

Perintah find mendukung -empty flag untuk mencari file dan direktori yang kosong. File kosong adalah file yang tidak memiliki konten di dalamnya, sedangkan direktori kosong adalah file yang tidak memiliki file atau subdirektori di dalamnya.

Misalnya, jika Anda ingin menemukan daftar direktori kosong di direktori home Anda, Anda dapat menjalankan:

find ~ -type d -empty

Meniadakan kecocokan

Perintah find juga memungkinkan Anda untuk "meniadakan" kecocokan. Ini berguna ketika kami memiliki kriteria untuk dikecualikan dari pencarian kami.



Sebagai contoh, katakan Anda ingin mencari file di /usr direktori yang tidak memiliki .txt perpanjangan. Anda dapat meniadakan -name beralih dengan menambahkan tanda seru (! ) di depannya, seperti yang ditunjukkan:

find /usr -type f ! -name '*.txt'

Anda juga dapat membalikkan sakelar lainnya. Jadi, jika Anda ingin menemukan direktori yang tidak kosong di direktori home Anda, jalankan:

find /usr -type f ! -empty

Menelusuri berdasarkan kepemilikan

Perintah find mendukung pencarian file dan direktori berdasarkan informasi kepemilikannya.

Untuk menemukan file atau direktori milik pengguna tertentu, Anda dapat menggunakan -user mengalihkan. Misalnya, jika Anda ingin menemukan semua file di sistem milik pengguna booleanworld , jalankan:

find / -type f -user booleanworld

Anda juga dapat menggunakan ID pengguna pada perintah di atas, sebagai ganti nama pengguna. Anda dapat mencari ID pengguna dengan perintah berikut:

id -u <username>

Demikian juga, -group switch memungkinkan Anda untuk mencari file dan direktori milik grup tertentu. Itu juga dapat menerima nama grup, atau ID grup. Anda dapat melihat ID grup pengguna dengan perintah berikut:

id -g <username>

Mencari file berdasarkan tanggal dan waktu

Terkadang, Anda mungkin perlu mencari file tergantung kapan file tersebut diakses atau dimodifikasi. Pada sistem Linux, ada tiga jenis "waktu" yang terkait dengan file:

  • Waktu modifikasi :Terakhir kali konten file diubah.
  • Waktu akses :Terakhir kali file dibaca.
  • Ubah waktu :Terakhir kali file (baik konten atau metadatanya, seperti izin) diubah.

Untuk menemukan file berdasarkan modifikasi, akses, atau perubahan waktu, perintah find memiliki -mtime , -atime dan -ctime switch. Sakelar ini memungkinkan Anda memfilter file berdasarkan jumlah hari. Di sini, "hari" mengacu pada periode 24 jam.

Mari kita pahami cara menggunakan flag-flag ini. Sebagai contoh, jika Anda menggunakan -mtime , maka:

  • -mtime 2 :File telah diubah 2 hari yang lalu (yaitu dalam 48 hingga 72 jam terakhir).
  • -mtime -2 :File diubah kurang dari 2 hari yang lalu (yaitu dalam 48 jam terakhir).
  • -mtime +2 :File telah diubah lebih dari 2 hari yang lalu (yaitu 3 hari atau lebih, yang berarti 72 jam atau lebih).

Jadi, untuk menemukan file di /usr yang diubah dua hari lalu, jalankan:

find /usr -type f -mtime 2

-atime dan -ctime sakelar bekerja persis dengan cara yang sama seperti -mtime .

Jika Anda merasa bahwa satu hari terlalu lama, Anda juga dapat menggunakan -mmin , -amin atau -cmin untuk menyaring dalam hitungan menit. Jadi, -amin +5 berarti file yang diakses lebih dari 5 menit yang lalu, -amin -5 berarti file telah diubah kurang dari 5 menit yang lalu, dan seterusnya.

Anda dapat menggunakan banyak dari bendera ini sekaligus. Jika Anda ingin menemukan file yang dimodifikasi 2 hari yang lalu dan diakses 5 menit yang lalu, jalankan:

find /usr -type f -mtime 2 -amin 5

Anda bahkan dapat mengulangi bendera yang sama! Sebagai contoh, Anda ingin mencari file yang dimodifikasi antara 50 dan 100 hari yang lalu, gunakan:

find /usr -type f -mtime +50 -mtime -100

Mencari berdasarkan ukuran

Perintah find memiliki -size beralih untuk memungkinkan pengguna menemukan file berdasarkan ukurannya. Karena hanya file yang dapat memiliki ukuran file, saat Anda menggunakan sakelar ini, tidak ada direktori yang akan dicantumkan.

Untuk menentukan ukuran file, kami menempatkan angka diikuti dengan huruf untuk mewakili unit. Anda dapat menggunakan huruf berikut:

  • c :byte
  • k :kilobyte
  • M :megabyte
  • G :gigabyte

Selain itu, Anda dapat menggunakan + atau - untuk memaksakan kondisi “lebih besar dari” atau “kurang dari”.

Mari kita pahami ini dengan beberapa contoh. Jika Anda ingin membuat daftar semua file pada sistem dengan ukuran 10 KB, gunakan:

find / -size 10k

Untuk menemukan file yang berukuran lebih dari 1 GB, gunakan:

find / -size +1G

Demikian pula, untuk menemukan file yang berukuran kurang dari 10 MB, gunakan:

find / -size -10M

Menelusuri berdasarkan izin

Perintah find mendukung -perm beralih untuk mengizinkan pencarian berdasarkan izin. Ini memungkinkan Anda untuk mencari berdasarkan mode numerik dan simbolik. Jika Anda tidak terbiasa dengan izin, Anda dapat menemukan ikhtisar di sini.

Menggunakan izin simbolis

Mari kita mulai dengan contoh sederhana. Misalkan, Anda ingin mencari semua file dan direktori di /usr direktori dengan izin rwxr-xr-x . Untuk melakukannya, jalankan:

find /usr -perm u=rwx,g=rx,o=rx

Huruf u , g dan o singkatan dari "pengguna", "grup" dan "pemilik".

Anda juga dapat menggunakan huruf a untuk memeriksa izin yang berlaku untuk semua pengguna. Misalnya, untuk menemukan semua file dan direktori pada sistem dengan izin r-xr-xr-x , jalankan:

find /usr -perm a=rx

Seringkali, kami tertarik untuk mencocokkan subset dari izin. Misalnya, Anda mungkin ingin mencari file pada sistem yang dapat dijalankan oleh semua pengguna. Dalam hal ini, kami hanya peduli bahwa bit eksekusi diatur untuk ketiga kelas izin. Namun, sisa bit mungkin disetel atau tidak disetel.

Karena semua kelas izin harus memiliki bit eksekusi, kami menulis izin sebagai a=x . Kemudian, kita tambahkan / di depan untuk menunjukkan bahwa kami bermaksud mencocokkan subset izin. Jadi, perintahnya adalah:

find / -type f -perm /a=x

Menggunakan izin numerik

Mari kita perhatikan contoh pertama di bagian sebelumnya. Ini cukup mudah — rwxr-xr-x adalah 644 dalam mode numerik, jadi Anda cukup menjalankan:

find /usr -perm 644

Memeriksa subset izin sedikit lebih rumit. Seperti yang kami sebutkan sebelumnya, mencari file yang dapat dieksekusi semua orang melibatkan pemeriksaan apakah bit eksekusi telah diatur. Kami tidak peduli dengan bagian lainnya. Untuk setiap bit yang harus kita periksa, kita beri 1, dan sisanya kita beri 0. Dengan proses ini, kita memperoleh bilangan biner dan kita mengubahnya menjadi oktal seperti yang ditunjukkan:

Selanjutnya, kita tambahkan - di depan nomor ini untuk menunjukkan bahwa kami bermaksud mencocokkan subset izin. Jadi, perintahnya adalah:

find / -type f -perm -111

Mencari berdasarkan tanda hak akses

Sekarang, katakanlah Anda tertarik untuk mencari berdasarkan flag hak numerik. Untuk tujuan ini, Anda dapat menggunakan mode numerik atau simbolik.

Sebagai contoh, katakanlah Anda tertarik untuk menemukan semua file di sistem Anda dengan set bit setuid. Kami dapat memperluas apa yang kami pelajari tentang mode numerik ke situasi ini. Dalam hal ini, kita hanya peduli dengan flag setuid, yang memiliki nilai 4. Namun, kita tidak peduli dengan bit izin apa pun, yang berarti kita mendapatkan 000. Dengan demikian, kita dapat mencari file-file ini menggunakan:

find / -type f -perm -4000

Tentu saja, Anda juga dapat memfilter bit izin. Jika Anda tertarik dengan file yang dapat dijalankan semua pengguna, dan juga memiliki setuid bit, ganti 4000 dengan 4111 pada perintah di atas. (Kami sebelumnya telah melihat bagaimana kami mendapatkan nilai 111.)

Demikian pula, Anda dapat menggunakan 2000 untuk bit setgid dan 1000 untuk bit lengket. Jika Anda ingin menguji kombinasi bit-bit ini, tambahkan nilainya. Misalnya, untuk menguji bit setuid dan sticky, Anda akan menggunakan 5000 (=4000 + 1000).

Jika Anda ingin melakukan hal yang sama dengan mode simbolik, Anda dapat menggunakan:

find / -type f -perm /u=s

Untuk bit setgid, gunakan /g=s , dan untuk sticky bit gunakan /o=t . Untuk menguji kombinasi bit ini, pisahkan dengan koma, seperti /u=s,o=t .

Membatasi kedalaman traversal

Seperti yang kami sebutkan sebelumnya, perintah find mencari item secara rekursif. Namun, hasil yang diperoleh mungkin sangat besar, dan Anda mungkin ingin menetapkan batas seberapa dalam perintah find dapat mencari. Ini dapat dilakukan dengan -maxdepth beralih.

Jika Anda menjalankan perintah berikut, Anda akan melihat bahwa semua item yang ditampilkan tidak lebih dari tiga level:

find / -maxdepth 3

Dalam situasi lain, Anda mungkin ingin menetapkan batas kedalaman minimum. Perintah find juga mendukung -mindepth beralih untuk tujuan ini. Jadi, jika Anda menjalankan:

find / -mindepth 3

Operasi logis dalam perintah find

Di bagian sebelumnya, kita telah melihat flag yang didukung oleh perintah find. Kami juga telah melihat bagaimana kami dapat menggabungkan berbagai bendera dan meniadakannya. Dalam beberapa situasi, kita membutuhkan konstruksi yang lebih kuat.

Perintah find mendukung kondisi “dan” dan “atau” dengan -a dan -o switch. Ini juga mendukung pengelompokan bagian dari ekspresi dengan tanda kurung () . Namun, karena tanda kurung juga merupakan karakter khusus untuk shell, Anda harus menempatkannya dalam tanda kutip tunggal atau ganda. Selain itu, saat Anda menentukan beberapa bendera satu demi satu, perintah find secara otomatis mengasumsikan "dan".

Mari kita perhatikan contoh yang kita lihat sebelumnya — menemukan direktori di dalam /usr yang dimulai dengan "python". Di sana, kami menggunakan perintah:

find /usr -type d -name 'python*'

Anda juga dapat menulis “dan” secara eksplisit seperti ini:

find /usr -type d -a -name 'python*'

Sekarang, mari kita pertimbangkan contoh yang berbeda. Misalkan, Anda ingin mencari file/direktori pada sistem yang dimodifikasi dalam 5 menit terakhir atau lebih awal dari 50 hari. Untuk perintah ini, kita akan menggunakan operator “atau” seperti ini:

find / -mmin -5 -o -mtime +50

Selanjutnya, misalkan kita memberlakukan batasan tambahan untuk masalah di atas — Anda ingin mencari file saja. Pertama, kami akan menjaga kondisi untuk memfilter file yang dimodifikasi dalam grup. Kemudian, kami akan "dan" dengan kondisi untuk menemukan file. Jadi, perintah terakhirnya adalah:

find / '(' -mmin -5 -o -mtime +50 ')' -a -type f

Sejak -a implisit, Anda juga dapat mengabaikannya dari perintah di atas.

Mengambil tindakan

Sejauh ini, semua perintah find mencetak hasilnya di terminal. Biasanya, kami ingin melakukan beberapa tindakan dengan hasil ini, seperti menyalin atau menghapus item ini. Untungnya, perintah find juga mendukung pengambilan "tindakan" pada hasil ini.

Tindakan default adalah mencetak semua hasil; Anda dapat memverifikasi ini dengan menambahkan -print beralih di akhir perintah find apa pun. Ada banyak tindakan lain juga. Kami akan melihat beberapa yang paling berguna di bawah ini.

Menghapus file

Untuk menghapus file atau direktori, gunakan -delete tindakan. Ia bekerja dengan file dan direktori. Misalnya, jika Anda ingin menghapus semua direktori kosong dari direktori home, jalankan:

find ~ -type d -empty -delete

Melaksanakan perintah

Perintah find juga mendukung eksekusi perintah khusus dengan -exec beralih.

Misalkan, Anda ingin mencadangkan semua audio MP3 Anda dari direktori home ke hard drive eksternal Anda. Asumsikan bahwa hard drive eksternal tersedia di /media/MyDrive . Untuk menyalin satu file, Anda akan menggunakan:

cp <path to file> /media/MyDrive

Untuk menyalin semua file, Anda dapat menggunakan perintah berikut.

find ~ -type f -name '*.mp3' -exec cp {} ';'

Di sini, sepasang kurung kurawal ({} ) bertindak sebagai pengganti untuk jalur ke file. Untuk memberi tahu perintah file di mana perintah berakhir, kami menggunakan titik koma(; ). Namun, karena ini juga merupakan karakter khusus untuk shell, kami membungkusnya dengan tanda kutip tunggal.

Setiap kali perintah find menemukan file yang cocok dengan kondisi, ia mengganti kurung kurawal dengan jalur sebenarnya, dan menjalankan perintah. Jadi, cp perintah dijalankan untuk setiap file MP3.

Mari kita lihat kegunaan penting lainnya — menemukan string di banyak file. Untuk menemukan string "halo" dalam file, kami menggunakan grep seperti ini:

grep hello <file name>

Jika Anda sudah familiar dengan grep , Anda mungkin tergoda untuk menulis perintah seperti ini:

find ~ -type f -exec grep hello {} ';'

Namun, jika Anda menggunakan perintah ini, Anda akan segera memahami masalahnya. Kami ingin daftar file dengan string "halo"; namun kami mendapatkan daftar baris yang cocok. Untungnya, grep memiliki -l switch, yang membuatnya mencetak jalur file jika ada kecocokan. Jadi, perintahnya adalah:

find ~ -type f -exec grep -l hello {} ';'

Melaksanakan perintah:varian yang berbeda

Misalkan, Anda ingin membuat file terkompresi. Untuk membuat file terkompresi Gzip dengan nama music.tar.gz , Anda akan menjalankan:

tar -czf music.tar.gz <list of files>

Sekarang, misalkan Anda ingin mengompres semua file MP3 di direktori home Anda, ke satu file terkompresi. Mungkin Anda akan menemukan yang berikut ini:

find ~ -type f -name '*.mp3' -exec tar -czf music.tar.gz {} ';'

Namun, jika Anda membuka music.tar.gz file, Anda akan melihat bahwa hanya ada satu file MP3. Ingat bahwa find mengeksekusi perintah setiap kali menemukan file baru. Jadi, file sebelumnya selalu ditimpa dengan arsip baru; dan kami tidak ingin itu terjadi.

Semua masalah kita bisa diselesaikan jika ada cara untuk memberitahu find untuk meneruskan daftar file ke tar , setelah menemukan semua file. Di sinilah varian kedua dari -exec switch masuk. Alih-alih mengakhiri perintah dengan ; , kami menggunakan + seperti ini:

find ~ -type f -name '*.mp3' -exec tar -czf music.tar.gz {} +

Mengeksekusi perintah pada direktori

Terkadang, berguna untuk menjalankan perintah pada direktori di mana file/direktori berada. Perintah find memiliki -execdir beralih yang melakukan ini. Ini mirip dengan -exec dalam semua cara lain, dan bahkan memiliki + dan ; varian.

Melihat informasi file

Jika Anda ingin melihat informasi tentang file/direktori (seperti izin dan ukuran), Anda dapat menggunakan -ls mengalihkan. Misalnya, jika Anda ingin melihat detail tentang file di sistem yang lebih besar dari 1 GB, jalankan:

find / -type f -size +1G -ls

Menghapus pesan kesalahan

Saat mencoba beberapa perintah find, Anda mungkin mendapatkan beberapa kesalahan seperti "Izin ditolak". Anda dapat menyembunyikan pesan kesalahan ini dengan mengarahkannya ke /dev/null , seperti yang ditunjukkan:

find [paths] [expression] [actions] 2>/dev/null

Kesimpulan

Dalam artikel ini, kita telah melihat cara menggunakan perintah find, bersama dengan contoh yang mencakup sebagian besar kasus penggunaan. Jika Anda ingin membaca lebih lanjut, Anda dapat membaca halaman manual dengan mengetik man find di terminal Anda.


Linux
  1. Cara Menggunakan Perintah find Linux untuk Menemukan File

  2. temukan Contoh Perintah di Linux

  3. Panduan untuk Perintah "Atas" Linux

  1. Temukan file dan direktori di Linux dengan perintah find

  2. Panduan terminal Linux untuk pemula

  3. Kuasai perintah Linux ls

  1. Temukan Waktu Eksekusi Perintah Atau Proses Di Linux

  2. Temukan file dan direktori terbesar di Linux

  3. Perintah cari di Linux