perintah untuk menemukan file dengan mencari hanya sebagian dari nama mereka?

32

Katakan ada file dengan nama:

batman.c
debate.c
cricketbat.c

Perintah apa dan bagaimana saya harus menggunakannya untuk mencantumkan semua file ini dengan menggunakan tag pencarian bat?

srk_cb
sumber
5
Apakah Anda ingin mendaftar file yang cocok hanya di direktori saat ini? di direktori mana saja di atau di bawah direktori saat ini? di mana saja pada sistem?
steeldriver

Jawaban:

47

Menemukan File dengan batDi Mana Saja

Untuk menemukan semua file di mana saja di dalam /path/to/folderyang namanya mengandung bat, Anda dapat menggunakan:

find /path/to/folder -name '*bat*'

Saya telah mengutip pola pencarian *bat*karena, jika tanda kutip dihilangkan dan file sesuai *bat*dalam direktori saat ini, shell akan memperluas *bat*ke dalam daftar mereka dan lulus yang ke find. Maka findtidak akan berhasil. ( \*bat\*dan "*bat*"juga bekerja.)

Untuk mencari di folder Anda saat ini (misalnya, bahwa Anda telah cddiedit), gunakan ., seperti biasa:

find . -name '*bat*'

Untuk mencari seluruh komputer Anda, gunakan/ . Untuk mencari direktori home Anda, gunakan ~, atau nama lengkap direktori home Anda. ( Shell mengembang~ ke jalur direktori home yang memenuhi syarat.)

Memperluas atau Mempersempit Pencarian Anda, Berdasarkan Nama

Jika Anda ingin mencari kasus-insensitively, sehingga file yang berisi BAT, bAtdan sebagainya dicocokkan, menggunakan -inametes bukan -nametes:

find /path/to/folder -iname '*bat*'

Saya perhatikan semua file Anda berakhir .c. Jika Anda hanya ingin menemukan file seperti itu, gunakan:

find /path/to/folder -name '*bat*.c'

Saya perhatikan semua nama file Anda ada batdi bagian paling awal atau paling akhir sebelum .csuffix. Jika Anda ingin menghindari pencocokan file seperti embattled.c, Anda dapat menggunakan:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oadalah operator atau .

Hanya Mencocokkan File

Untuk menemukan hanya file biasa - dan bukan folder, tautan simbolik, dan simpul perangkat khusus - yang dapat Anda gunakan -type f. Ini sering direkomendasikan dan kadang-kadang cukup tepat ... tetapi sering kali bukan yang Anda inginkan , terutama jika Anda berlari finddengan tujuan memeriksa output sendiri. Jika Anda memiliki tautan simbolis yang cocok dengan pencarian Anda, tidakkah Anda ingin mengetahuinya?

Jika Anda ingin menemukan file biasa dan tautan simbolik, Anda dapat menggunakan:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

Itu menggunakan -ooperator dan juga tanda kurung untuk pengelompokan (yang harus dikutip agar shell tidak memperlakukan mereka secara khusus; jika tidak, Anda akan mendapatkan kesalahan sintaksis).

Tetapi misalkan Anda hanya ingin melihat tautan simbolis yang pada akhirnya mengarah ke file biasa (dan bukan tautan simbolis ke direktori, simpul perangkat, dll.). Itu sebenarnya lebih sederhana: gunakan -xtypebukan -type. Asalkan Anda tidak menjalankan finddengan -Lbendera, -xtypepada tautan simbolik menguji jenis file yang ditunjukkan oleh tautan tersebut.

find /path/to/folder -name '*bat*' -xtype f

Jika Anda memiliki symlink ke symlink lain ke sebuah file, -xtype fakan cocok dengan itu meskipun target langsungnya adalah symlink lain daripada file biasa. Ini hampir selalu yang Anda inginkan.

Seringkali orang mengira mereka menginginkannya -type f, tetapi sebenarnya mereka menginginkannya -xtype f.

Mendapatkan Output Rinci

findTindakan default jika Anda tidak menentukan satu adalah -print. Semua perintah yang diberikan di atas setara dengan diri mereka sendiri dengan -printditempel di akhir.

findsering digunakan untuk menjalankan perintah berdasarkan file yang ditemukan - seringkali, perintah yang membuat perubahan. Tetapi ada juga tindakan lain yang tujuannya adalah untuk menampilkan hasil, selain itu -print. Yang menarik adalah -ls:

find /path/to/folder -name '*bat*' -ls

Ini memberikan informasi terperinci tentang setiap file, dalam format multi-kolom, mirip dengan (meskipun tidak sama dengan) apa yang akan Anda lihat dengan menjalankan .ls file

Bacaan lebih lanjut

Untuk informasi lebih lanjut tentang finddan cara lain untuk menemukan file, lihat:

Eliah Kagan
sumber
1
Jawaban yang bagus, terutama -xtypenasihatnya; mungkin ls *bat*dan -maxdepth/ mindepthjuga layak disebut.
mklement0
2
@ mklement0 Terima kasih! OP belum memberikan klarifikasi tentang di mana file berada dan apakah rekursi diperlukan atau tidak. Saat jawaban kekacauanls sudah dibahas , saya fokus pada kasus rekursif dengan di findsini. Tentu saja, jawaban terperinci yang mencakup daftar nama file yang tidak (atau kurang) rekursif cocok dengan beberapa pola ( lsdan finddengan -maxdepth) juga akan berguna. Anda mungkin ingin memposting jawaban seperti itu!
Eliah Kagan
16

Cara termudah adalah menjalankannya

locate bat

Dengan cara ini Anda dapat mencari di seluruh komputer file yang berisi "bat" dalam nama file

Untuk menyegarkan daftar file di PC Anda dijalankan

updatedb

Jalankan perintah ini ketika Anda baru saja menambahkan file baru ke akun Anda

Mark Kirby
sumber
1
kebutuhanupdatetdb
Sergiy Kolodyazhnyy
4
@Erg. Untuk menemukan file baru (lebih baru dari yang terakhir kali updatedbterakhir secara manual atau secara otomatis dijalankan), sudo updatedbperlu dijalankan terlebih dahulu, ya.
Eliah Kagan
Perhatikan bahwa ini akan mencari seluruh sistem untuk nama yang cocok bat.
terdon
1
@terdon Saya sudah menyatakan ini dalam jawaban, jangan berpikir itu pantas untuk dipilih ketika saya sudah menyatakan ini.
Mark Kirby
1
Catatan bahwa ini adalah BANYAK lebih cepat daripada find /sebagai locatepencarian dari database, sementara finddaftar rekursif /dan kemudian cocok dengan regex.
Timothy Gu
14

Buka terminal dan ubah direktori ke direktori dari mana Anda ingin mulai mencari dan kemudian jalankan perintah ini:

find . -name "*bat*" -type f 

The .dimulai perintah find dari direktori saat ini.
The -namecocok string batdan kasus sensitif. ( -inamePeka terhadap huruf)
The -type fpencarian untuk file saja.

karel
sumber
hapus dan batalkan penghapusan? ok +1: P;)
AB
6

Jika file-file tersebut dalam direktori saat ini gunakan:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

Atau (memilikinya baris demi baris):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

Jika Anda ingin mencari sistem untuk file-file itu, gunakan:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c
kekacauan
sumber
1
Jika pencarian Anda dimulai dengan direktori root, Anda mungkin ingin menambahkan sudo, karena perintah ini akan melaporkan 'Izin ditolak' untuk beberapa folder
Sergiy Kolodyazhnyy
4

Anda ingin menggunakan findperintah, dengan -inameopsi untuk pencocokan nama file case sensitif, atau -nameopsi untuk nama file case sensitif cocok. Keduanya akan memungkinkan Anda menggunakan nama wildcard. Jadi, untuk menemukan nama file yang berisi "bat", Anda akan menggunakan:

find / -iname '*bat*'

Atau

find / -name '*bat*'

The *berarti "karakter (s)", sehingga pencarian mencari batdengan karakter, termasuk tidak ada, sebelum atau setelah itu. The /pencarian dari direktori root rekursif, Anda dapat menggunakan .yang akan mencari secara rekursif dari direktori saat ini, atau path absolut untuk di mana Anda ingin mencari dari. Lihatlah bagaimana mencari file menggunakan regex di skrip shell linux

AJefferiss
sumber
@EliahKagan terima kasih, saya telah menambahkan beberapa informasi lebih lanjut ke jawaban saya.
AJefferiss
+1 Terima kasih atas hasil edit. IMO itu adalah kekuatan dari jawaban ini yang menghindari merekomendasikan penggunaan sembarangan -type f, yang tidak lebih dari sekadar mengecualikan direktori dan seringkali bukan apa yang benar-benar diinginkan pengguna .
Eliah Kagan
2

Gunakan yang lama yang baik find.

find <path_for_search> -type f -iname "*bat*" 

misalnya.:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

dari man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
AB
sumber