Cara menemukan file dari direktori apa pun

22

Saya mencoba mencari file bernama Book1 .

Dalam pengujian saya, saya mencoba mencari file yang disebutkan di atas dan dalam tes ini, saya tidak tahu di mana file itu berada.

Saya mencoba find / -iname book1tetapi tidak ada output.

Bagaimana cara menemukan file saya disebut book1 menggunakan baris perintah jika saya tidak tahu di mana file itu berada?

EDIT:

Skenario saya dijelaskan secara lebih rinci di bawah ini:

  1. Ekstensi file tidak diketahui
  2. Nama persisnya (yaitu huruf kapital, angka, dll.) Tidak diketahui
  3. Lokasi file tidak diketahui
Aspire27
sumber
2
Jika ada file yang dipanggil Book1, dan itu ada di direktori yang bisa Anda baca, maka find / -iname book1akan menemukannya. Apakah Anda yakin itu sebenarnya Book1, dan bukan Book1.xyz?
Fox
Nama lengkap file tersebut adalah Book1.gnumeric. Apakah Anda mengatakan bahwa saya harus menentukan seluruh nama file? Untuk beberapa alasan saya pikir, untuk perintah khusus ini, yang saya butuhkan hanyalah nama umum file tersebut. Pengujian saya mencoba menemukan file jika misalnya, saya tidak ingat ekstensi file dan hanya jenis yang tahu nama file yang saya cari. Mohon saran.
Aspire27
@don_crissti Selesai. Silakan lihat Edit di atas.
Aspire27
Anda sedang mencampur find dan locate. locatemurah hati, dan akan menemukan apa pun yang cocok, asalkan ada di database-nya, yang biasanya diperbarui setiap hari. find, dalam hal ini, mencari berkas glob, jenis pola yang akan Anda gunakan ls. Anda mungkin berarti iname '*book1*'. Perhatikan bahwa polanya harus berada di dalam tanda kutip untuk menghentikan shell agar tidak memperluasnya sebelum findmelihatnya. Juga perhatikan bahwa find, seperti banyak perintah * nix, sangat sunyi ketika tidak berhasil.
Manngo

Jawaban:

31

Pertama, argumen -inameadalah pola shell . Anda dapat membaca lebih lanjut tentang pola dalam manual Bash . Intinya adalah agar findbenar-benar menemukan file nama file harus cocok dengan pola yang ditentukan. Untuk membuat book1kecocokan string case-insensitive Book1.gnumericAnda juga harus menambahkan *sehingga terlihat seperti ini:

find / -iname 'book1*'

atau sebutkan nama lengkap:

find / -iname 'Book1.gnumeric'

Kedua, -inameakan membuat findabaikan case nama file jadi jika Anda menentukannya -iname book1mungkin juga menemukan Book1, bOok1dll. Jika Anda yakin file yang Anda cari dipanggil Book1.gnumeric maka jangan gunakan -inametetapi -name, itu akan lebih cepat:

find / -name 'Book1.gnumeric'

Ketiga, ingat tentang mengutip pola seperti yang dikatakan dalam jawaban lain .

Dan yang terakhir - Anda yakin ingin mencari file di mana saja di sistem Anda? Mungkin saja file yang Anda cari sebenarnya ada di $HOMEdirektori Anda jika Anda mengerjakannya atau mengunduhnya dari suatu tempat. Sekali lagi, itu mungkin jauh lebih cepat.

EDIT :

Saya perhatikan bahwa Anda mengedit pertanyaan Anda. Jika Anda tidak mengetahui nama lengkap, huruf besar, dan lokasi, Anda harus menggunakan sesuatu seperti ini:

find / -iname 'book1*'

Saya juga menyarankan meletakkan 2>/dev/nulldi akhir baris untuk menyembunyikan semua *permission denied*dan kesalahan lain yang akan ada jika Anda memanggil findsebagai pengguna non-root:

find / -iname 'book1*' 2>/dev/null

Dan jika Anda yakin sedang mencari satu file, dan hanya ada satu file di sistem Anda yang sesuai dengan kriteria yang dapat Anda kirim finduntuk keluar setelah menemukan file yang cocok pertama:

find / -iname 'book1*' -print -quit 2>/dev/null
Arkadiusz Drabczyk
sumber
1
-inametidak portabel
Gert van den Berg
6

Anda dapat mencoba locateperintahnya. Ini menggunakan database nama file untuk membuat pencarian lebih cepat.

Untuk mencari semua file yang cocok *book1*, dan mengabaikan case, Anda bisa menggunakan

locate -i book1

jika Anda ingin mencari file yang dimulai dengan book1Anda harus melakukan wildcard sendiri:

locate -i 'book1*'

Ini jauh lebih cepat daripada find, tetapi hanya sebagai up-to-date sebagai terakhir kali database disegarkan.

James K
sumber
5

Jika Anda tahu Anda memiliki file yang dipanggil book1.something, di mana lokasi file, nilai tepat something, dan pola kapitalisasi nama file semua tidak diketahui:

find / -iname 'book1.*'

Jika yang Anda tahu pasti adalah bahwa nama file mengandung kata book, Anda dapat membuat daftar yang kemungkinan jauh lebih besar

find / -iname '*book*'

Argumennya -nameadalah pola shell glob. Dari direktori tempat file berada, bandingkan:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

Ini mewakili jenis pencarian yang dilakukan oleh -name. The -inamepilihan hanya memungkinkan versi case-insensitive ini.

Rubah
sumber
1

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

Akan melaporkan jalan semua file yang namanya mengandung book1(dengan variasi kasus, tetapi hanya mengingat ASCII karakter latin bokBOK, tidak banyak variasi lainnya di Unicode seperti 𝗄, 𝚔, 𝘬, , , , dan semua variasi mereka dengan diakritik ...) di semua direktori yang telah Anda baca aksesnya.

Stéphane Chazelas
sumber
0

Untuk tugas-tugas semacam ini saya selalu melakukan: find / -iregex '.*Book1.*'

Formulir ini akan menangani 3 poin skenario Anda ( iregexadalah kasus ekspresi rasional tidak sensitif, dan pola dengan .*di kedua sisi akan cocok dengan karakter apa pun sebelum dan setelah pola tetap Anda Book1 - ini jelas dapat memberikan Anda lebih banyak hasil daripada yang diperlukan tetapi Anda yakin tidak ketinggalan file)

Perbedaan utama: jika mungkin, lebih ketat daripada hanya menggunakan /, seperti mencoba hanya /homeatau lebih, jika tidak Anda akan turun di beberapa direktori yang tidak relevan ( /sys, /dev, dll ...)

Namun ingat bahwa izin Unix berlaku: jika file tersebut ada di direktori yang findhaknya digunakan pengguna untuk menjalankan perintah (mengeksekusi), findtidak akan dapat menemukannya di sana.

Patrick Mevzek
sumber
iregex tidak akan berfungsi di tempat-tempat seperti Solaris (OS tidak ditentukan) (dan mungkin * BSD), itu adalah ekstensi GNU dan bukan bagian dari standarfind
Gert van den Berg
0

Silver Searcher adalah utilitas yang sangat cepat dan praktis untuk mencari file dan konten.

Untuk mengatasi masalah Anda, perintah pencari perak akan terlihat seperti ini ...

ag -g Book1

-g PATTERN Cetak nama file yang cocok dengan POLA

qoomon
sumber
0

locate dan variannya cenderung merupakan metode yang cepat.

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

Jika lokasi tidak tersedia, Anda dapat menggunakannya find. Itu cenderung jauh lebih lambat, tetapi juga jauh lebih tepat.

Jika Anda memiliki partisi tunggal: (jalankan sebagai root jika pengguna Anda mungkin tidak memiliki akses ke file)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

Jika Anda tidak memasukkan -xdev findpencarian pada partisi lain, seperti /procdan /sys, yang cenderung membanjiri layar Anda dengan kesalahan, terutama jika Anda tidak melakukan root. (Kesalahan dapat disembunyikan dengan menambahkan 2> /dev/nullpada akhir perintah find (komentar harus dihapus))

Jika Anda memiliki banyak partisi dan Anda tidak tahu di mana file itu berada, Anda bisa mendapatkan daftar dengan lsblk(pada OS berbasis Linux, parsing dfoutput adalah pilihan lain) dan masukkan itu ke dalam menemukan: (root lagi jika Anda tidak tahu apakah Anda dapat mengakses file)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(Ini agak rapuh jika salah satu mountpoints Anda memiliki spasi di) ( dfparameter mungkin perlu tuning. -P membuat GNU dfmemberikan output POSIX standar. Versi lain mungkin memiliki parameter lain atau perlu ditinggalkan. Baca halaman manual Anda)

Tidak grep -Ftermasuk hal-hal lain yang dikembalikan, seperti partisi swap.

Dalam versi non-GNU, awk menemukan perangkat dengan mount yang dimulai dengan /devuntuk mendapatkan sistem file nyata dan kemudian mencetak bidang terakhir (titik mount) dari dfoutput.

Ini juga mengasumsikan shell seperti bourne ( kshdan bashharus bekerja. Jika Anda menggunakan cshvarian, mulai shell scriptable sebelum Anda mencoba ini)

Gert van den Berg
sumber
The greps mungkin sedikit bising, belajar bagaimana untuk menyaring itu lebih baik (ini seharusnya tidak diperlukan dengan contoh, tetapi jika itu adalah sesuatu yang lebih umum yang mencari, yang greps akan perlu tuning untuk menjaga tingkat kebisingan bawah)
Gert van den Berg
0

ag (pencari perak) menyediakan pencarian sangat cepat dalam file, dan juga memiliki opsi untuk mencari nama file:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

Jadi dalam kasus penggunaan saya di sini> 30 kali lebih cepat jika file tersebut bukan file yang diabaikan oleh ag.

Tomtt
sumber