Perintah find digunakan untuk mencari file dan direktori di baris perintah Linux.
Temukan adalah salah satu perintah yang paling kuat dan sering digunakan. Ini juga merupakan salah satu perintah paling ekstensif dengan lebih dari 50 opsi dan ini membuatnya sedikit membingungkan, khususnya ketika dipasangkan dengan perintah exec atau xargs.
Tidak mungkin bagi sysadmin atau pengembang perangkat lunak untuk menghindari perintah find saat bekerja di baris perintah. Alih-alih takut, Anda harus merangkul kekuatannya.
Saya akan membahas beberapa contoh paling umum dari perintah find yang kemungkinan besar akan Anda gunakan. Namun sebelum itu, izinkan saya menunjukkan sintaks dan cara menggunakannya.
Temukan perintah di Linux
Sintaks umum untuk perintah find adalah:
find [directory to search] [options] [expression]
Semua yang ada di dalam kurung [] adalah opsional. Artinya Anda dapat menjalankan find
perintah tanpa opsi dan argumen apa pun. Itu hanya akan membuang semua file dan direktori di lokasi saat ini. Itu tidak terlalu berguna, kan?
Mari kita lihat lebih detail:
directory to search
pada dasarnya adalah lokasi dari mana Anda ingin memulai pencarian Anda. Secara default, pencarian bersifat rekursif dan dimulai dari lokasi Anda saat ini.options
tentukan jenis pencarian, baik itu berdasarkan nama, jenis, waktu modifikasi, dll. Ada lebih dari 50 opsi yang tersedia di sini.expression
memungkinkan Anda untuk menentukan istilah pencarian. Jika Anda ingin mencari file berdasarkan namanya, ekspresi adalah nama filenya. Jika Anda ingin menemukan file dengan nama yang cocok dengan suatu pola, ekspresikan dalam pola tersebut.
Mari saya ambil contoh sederhana:
find . -type f -name myfile
Perintah ini akan menjalankan pencarian di direktori saat ini dan subdirektori untuk menemukan file (bukan direktori) bernama myfile
. Opsi -type f
memintanya untuk mencari file saja. Satu titik .
berarti direktori saat ini.
Mari kita lihat beberapa contoh praktis dari perintah find.
Menemukan file dan direktori berdasarkan nama
Anda dapat mencari file dan direktori dengan namanya:
find . -name SEARCH_NAME
Karena tidak ada jenis file yang disebutkan, ia akan mencari file dan direktori dengan nama yang diberikan.
Contoh di bawah ini menemukan file dan direktori bernama mystuff:
[email protected]:~/Examples$ find -name mystuff
./new/mystuff
./mystuff
Temukan hanya file atau direktori saja
Jika Anda hanya ingin mencari file, tentukan jenis file -f:
find . -type f -name SEARCH_NAME
Urutan jenis dan nama tidak masalah. Ambil contoh sebelumnya dan temukan hanya untuk file:
[email protected]:~/Examples$ find -type f -name mystuff
./mystuff
Jika Anda hanya ingin mencari direktori, tentukan jenis -d:
find . -type d -name SEARCH_NAME
Di file sebelumnya, cari direktori saja:
[email protected]:~/Examples$ find -type d -name mystuff
./new/mystuff
Jalankan pencarian case-insensitive
Secara default, perintah find peka huruf besar/kecil. Anda dapat menjalankan pencarian peka huruf besar/kecil dengan nama yang diberikan dengan menggunakan -iname
bukannya -name
.
find . -type f -iname SEARCH_NAME
Anda dapat menggunakannya dengan type d
juga.
[email protected]:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff
Tangkapan layar dari tiga contoh di atas:
Mencari file menurut ekstensinya (penting)
Salah satu penggunaan paling umum dari perintah find adalah untuk menemukan file dari jenis tertentu atau haruskah saya mengatakan ekstensi tertentu.
Misalnya, Anda ingin mencari semua file C++ di direktori saat ini. File C++ diakhiri dengan ekstensi .cpp, sehingga Anda dapat mencarinya seperti ini:
find . -type f -name "*.cpp"
Dengan cara ini, Anda memberi tahu perintah find untuk mencari type file
dan dengan nama yang diakhiri dengan .cpp
.
[email protected]:~$ find . -type f -name "*.cpp"
./file.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.cpp
Selalu letakkan ekspresi pencarian Anda dalam tanda kutip ganda saat menggunakan perintah find. Mengapa saya merekomendasikan penggunaan tanda kutip ganda atau tanda kutip tunggal di sekitar istilah pencarian Anda? Karena jika Anda tidak melakukannya, shell akan memperluas wildcard.
Jika Anda tidak membungkus istilah pencarian Anda dengan tanda kutip:
find . -type f -name *.cpp
Shell Anda akan memperluas *.cpp dan menggantinya dengan semua file di direktori saat ini yang namanya diakhiri dengan .cpp.
Ini bisa bekerja jika hanya ada satu file tetapi jika ada lebih dari satu, shell Anda akan mengeluhkan sintaks yang salah.
Dalam contoh di atas, hanya ada satu file cpp dan karenanya ketika perintah diperluas ke find . -type f -name file.cpp
, ini berfungsi karena file.cpp
masih berfungsi sebagai istilah penelusuran.
Tetapi ada dua file .txt di direktori yang sama dan karenanya ketika perintah diperluas ke find . -type f -name another.txt new.txt
, ia mengeluh karena ada lebih dari satu istilah penelusuran sekarang.
Inilah sebabnya mengapa Anda harus selalu membungkus istilah pencarian Anda dengan tanda kutip ganda.
Telusuri banyak file dengan banyak ekstensi (atau kondisi)
Perintah di atas mencari file dengan ekstensi yang diberikan. Bagaimana jika Anda ingin mencari file dengan ekstensi yang berbeda?
Alih-alih menjalankan perintah find beberapa kali, jalankan sekali dengan menggunakan -o
opsi yang berfungsi sebagai kondisi OR logis:
find . -type f -name "*.cpp" -o -name "*.txt"
Ini contohnya:
[email protected]:~/Examples$ find . -type f -name "*.txt" -o -name "*.cpp"
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt
Cari file di direktori tertentu
Sejauh ini, semua contoh melakukan pencarian di direktori saat ini karena Anda menentukan . dalam contoh.
Titik dapat diganti dengan jalur absolut atau relatif direktori sehingga Anda dapat mencari file di direktori yang ditentukan tanpa meninggalkan lokasi Anda saat ini.
[email protected]:~/Examples$ find ./new -name mystuff
./new/mystuff
Mencari file di beberapa direktori
Jika menurut Anda file yang Anda inginkan dapat ditemukan di beberapa lokasi, Anda tidak perlu menjalankan perintah find beberapa kali. Cukup tentukan semua jalur direktori untuk mencari di perintah find:
find ./location1 /second/location -type f -name "pattern"
Temukan file dan direktori kosong
-empty
opsi ini memungkinkan Anda untuk mencari file dan direktori kosong dengan perintah find.
Untuk menemukan semua file dan direktori kosong di direktori saat ini, gunakan:
find . -empty
Anda dapat menentukan jenis file untuk hanya mencari file atau direktori kosong:
find . -empty -type f
Anda juga dapat menggabungkannya dengan pencarian nama file:
find . -empty -type f -name "*.cpp"
Temukan file besar atau kecil (Cari berdasarkan ukuran file)
Anda dapat menemukan file besar atau file kecil berdasarkan pencarian yang dilakukan oleh parameter ukuran. Ini hanya berfungsi dengan file, bukan direktori.
Anda menggunakan -size
opsi dengan +N untuk ukuran lebih besar dari N dan -N untuk ukuran lebih kecil dari N.
Temukan file berukuran tepat 50 KB:
find . -size 50k
Untuk mencari file yang lebih besar dari 1 GB di direktori saat ini:
find . -size +1G
Untuk menemukan yang lebih kecil dari 20 byte:
find . -size -20c
Untuk menemukan file yang lebih besar dari 100 MB tetapi lebih kecil dari 2 GB:
find . -size +100M -size -2G
Anda juga dapat menggabungkan pencarian ukuran dengan pencarian nama. Misalnya, untuk mencari semua file dengan nama berakhiran .log tetapi berukuran lebih besar dari 500 MB di direktori root, Anda dapat menggunakan:
find / -size +500M -name "*.log"
Untuk mengingat:
c
:bytek
:kilobyteM
:MegabyteG
:Gigabyte
Temukan file yang baru dimodifikasi (Penelusuran berdasarkan waktu modifikasi atau pembuatan)
Anda tahu konsep mtime, atime dan ctime, bukan?
- mtime:waktu terakhir modifikasi file
- ctime:waktu pembuatan file
- atime:waktu akses terakhir file
Anda akan sering menemukan diri Anda dalam situasi di mana Anda ingin menemukan semua file yang baru saja dimodifikasi. Pencarian dengan waktu yang dimodifikasi membantu dalam kasus seperti itu.
Untuk menemukan semua file yang dimodifikasi dalam 3 hari (3*24H), gunakan:
find . -type f -mtime -3
Untuk menemukan semua file yang dibuat setidaknya 5 hari (5*24H) yang lalu, gunakan:
find . -type f -ctime +5
Saya tahu 24 jam adalah kerangka waktu yang sangat besar. Bagaimana jika Anda ingin mencari file yang diubah hanya beberapa menit yang lalu? Untuk itu, Anda dapat menggunakan mmin
, amin
dan cmin
.
Untuk menemukan semua file yang diubah dalam 5 menit terakhir, gunakan:
find . -type f -mmin -5
Anda dapat menentukan batas atas dan bawah bersama dengan nama pencarian. Perintah di bawah ini akan mencari semua file .java yang telah dimodifikasi antara 20 hingga 30 menit terakhir.
find . -type f -mmin +20 -mmin -30 -name "*.java"
Temukan file dengan izin file tertentu
Saya harap Anda sudah familiar dengan konsep izin file di Linux.
Perintah find memungkinkan Anda mencari file dengan izin file dan mode akses tertentu.
find -perm mode
Misalnya, untuk menemukan semua file mode akses 777 di direktori saat ini;
find . -perm 777
Untuk menemukan semua file dengan akses baca dan tulis untuk semua (pencocokan persis, tidak akan cocok jika file memiliki izin eksekusi untuk semua):
find . -perm a=r+w
Menemukan file milik pengguna
Anda juga dapat mencari file berdasarkan kepemilikan.
Misalnya, untuk menemukan file yang dimiliki oleh pengguna John di direktori saat ini, gunakan:
find . -type f -user John
Anda juga dapat menggabungkannya dengan opsi lain seperti ukuran, waktu, dan nama:
find . -type f -user John -name "*.cpp"
Jangan temukan secara rekursif, cari hanya di direktori saat ini
Secara default, perintah find mencari di semua subdirektori di lokasi Anda saat ini. Jika Anda tidak menginginkannya, Anda dapat menentukan kedalaman pencarian Anda menjadi 1. Ini akan membatasi pencarian hanya pada direktori saat ini dan mengecualikan subdirektori apa pun.
find . -maxdepth 1 -type f -name "*.txt"
Kecualikan direktori dari pencarian
jika Anda ingin mengecualikan direktori dari pencarian, Anda dapat melakukannya dengan menggabungkan path, prune dan logis atau.
find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME
Hati-hati dengan * di jalur direktori, -prune
setelah jalur dan -o
setelah dipangkas.
Pada dasarnya, perintah prune meminta untuk tidak menggunakan nilai yang ditentukan oleh jalur. Prune selalu digunakan dengan -o
untuk memastikan bahwa sisi kanan istilah dievaluasi hanya untuk direktori yang tidak dipangkas.
Ambil tindakan atas hasil perintah find (exec dan xargs)
Sejauh ini, Anda telah mempelajari berbagai cara untuk menemukan file berdasarkan berbagai kriteria. Bagus. Tetapi Anda dapat membuatnya lebih baik dengan mengambil tindakan tertentu pada hasil perintah find.
Misalnya, bagaimana dengan menemukan file yang cocok dengan pola nama tertentu dan mengganti namanya sekaligus atau menemukan file kosong dan menghapusnya?
Anda tahu bahwa pengalihan pipa dapat digunakan untuk menggabungkan output dari satu perintah dengan input dari perintah lain. Tapi ini tidak akan bekerja dengan output dari perintah find, setidaknya tidak secara langsung.
Anda memiliki dua opsi jika Anda ingin mengambil tindakan pada hasil perintah find:
- Gunakan exec
- Gunakan xargs
Menggunakan find dan exec
Misalkan Anda ingin membuat daftar panjang (ls -l) file pencarian dengan perintah find. Inilah yang Anda gunakan:
find . -type f -name "*.txt" -exec ls -l {} +
Berikut outputnya:
[email protected]:~/Examples$ find . -type f -name "*.txt" -exec ls -l {} +
-rw-rw-r-- 1 abhishek abhishek 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 abhishek abhishek 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:16 ./new.txt
Banyak orang lupa menambahkan {} +
di akhir perintah exec. Anda harus menggunakannya dan memperhatikan jarak antara {} dan +.
{} adalah yang mereferensikan hasil dari perintah find. Anda bisa membayangkannya seperti {file 1, file 2, file 3}. +
tanda digunakan untuk mengakhiri perintah exec.
Ada juga konvensi lain dengan exec:
find . -type f -name *.txt" -exec ls -l {} \;
Di Sini,; digunakan sebagai pengganti tanda +. Tambahan \ sebelum; digunakan untuk menghindari karakter khusus;.
Keuntungan {} +
adalah menjalankan lebih sedikit perintah sebagai ls -l file1 file2 file3
sedangkan {} \;
akan menjalankan ls -l file1
, ls -l file2
dll.
Tapi, {} \;
memiliki keuntungan menggunakan {}
lebih dari sekali dalam pernyataan exec yang sama. Misalnya, perintah di bawah ini akan mengganti nama semua file yang ditemukan dengan ekstensi .old.
find . -type f -name *.txt" -exec mv {} {}.old \;
Menggunakan xargs
Banyak pengguna Linux yang terbiasa dengan pengalihan pipa. Perintah exec ini dengan {} +
. di akhir tampaknya menakutkan bagi mereka.
Di sinilah xargs membantu. Anda cukup mengurai output dari perintah find ke perintah xargs melalui pipa.
find . -type f -name *.txt" | xargs ls -l
Sintaksnya tampak jauh lebih sederhana, bukan? Perintah Xargs juga sangat kuat. Anda dapat membacanya di sini.
Menggabungkan find dan grep
Sekarang setelah Anda mengetahui tentang menggabungkan perintah find dengan xargs dan exec, Anda dapat menggunakannya untuk menggabungkan find dan grep.
Untuk sysadmin atau pengembang perangkat lunak mana pun, find dan grep adalah salah satu kombinasi yang paling umum namun paling berguna.
Anda mencari pola nama file dengan find dan kemudian menggunakan grep untuk mencari konten di dalam file tersebut.
Misalnya, Anda ingin mencari semua file .txt yang berisi istilah Alice. Anda menggabungkan find dan grep seperti ini:
find . -type f -name "*.txt" -exec grep -i alice {} +
Hal yang sama dapat dicapai dengan xargs juga:
find . -type f -name "*.txt" | xargs grep -i alice
Tentu saja, ini adalah contoh yang paling sederhana tetapi jika Anda terbiasa dengan perintah grep, Anda dapat menggunakannya sesuai keinginan dan kebutuhan Anda.
Ada banyak lagi dengan find ...
Dan tidak mungkin untuk membuat daftar semua opsi dan contoh perintah find. Kemungkinannya tidak terbatas tetapi ketika Anda terbiasa dengan perintah find, Anda dapat mulai menggunakannya dalam berbagai situasi. Terserah Anda bagaimana Anda menggabungkan logika di sini.
Saya harap Anda menemukan contoh perintah find ini berguna. Jika Anda masih memiliki pertanyaan atau saran untuk menyempurnakan artikel ini, beri tahu saya di bagian komentar.