Bagaimana cara menemukan file dengan nama file di terminal Mac OSX?

119

Saya ingin mencari file di Macbook saya dengan nama file: abc.dmg. Saya sudah mencoba menggunakan lampu sorot, tetapi tidak menemukannya. Ketika saya mencoba menemukan, dan menggunakan find -name abc.dmg -path /:, saya mendapatkan kesalahan kembali.

Apa sintaks yang tepat untuk menemukan file dengan nama file dengan perintah find di terminal Mac OSX?

SPRBRN
sumber
1
@VxJasonxV Pertanyaan Apple 100% tentang topik untuk Pengguna Super, dan tidak perlu setiap pertanyaan Apple dipindahkan ke sana. Namun pertanyaan iPhone atau iPad akan dipindahkan ketika / jika diperlukan.
BinaryMisfit
Bukan karena alasan di luar topik, tetapi fakta bahwa ada topik / situs yang lebih spesifik untuk subjek umum ini.
VxJasonxV
@Diago: Apakah ada diskusi tentang ini di meta atau chat? Hanya ingin tahu karena AFAIK apple.SE akan segera diluncurkan dari versi beta, jadi alangkah baiknya jika semua orang berada di halaman yang sama.
Robert S Ciaccio
1
@calavera. Diskusi yang cukup lama tetapi relevan dapat ditemukan di sini . Apple SE, Ubuntu SE, dan Linux SE ada di sana untuk memuji Super User, tetapi kami sama sekali tidak ingin memaksa pengguna untuk pindah. Saya lebih suka mengajukan pertanyaan Apple saya di sini daripada Apple, karena saya menggunakan 3 sistem operasi yang berbeda. Jika saya memiliki pertanyaan yang sangat spesifik, saya akan menanyakannya di situs yang lebih khusus.
BinaryMisfit

Jawaban:

164

Dalam bentuknya yang paling sederhana, finddibutuhkan satu parameter: path. Dalam bentuknya yang benar-benar bermanfaat, dibutuhkan jalur yang diikuti oleh kriteria penyempitan.

Jadi, Anda ingin:

  • find (program)
  • / (jalan), dan
  • -name abc.dmg (kriteria).
find / -name abc.dmg
VxJasonxV
sumber
12
Anda mungkin mendapatkan izin kesalahan ketik yang ditolak saat mencari di seluruh drive tetapi mereka dapat diabaikan kecuali Anda mengharapkan file berada di folder terbatas. Jika demikian, gunakan sudo find / -name abc.dmg
Chris Nava
Sudah mencobanya, tetapi tidak ada hasil.
SPRBRN
6
Agaknya, Anda tidak memiliki file bernama abc.dmg di komputer Anda. Anda dapat menggunakan -iname bukan -nama untuk membuat case search tidak sensitif. Saya sangat ragu Anda benar-benar mencari "abc.dmg", dan mengingat fakta itu (mungkin), sulit untuk memberi tahu Anda apa masalah Anda tanpa memiliki perincian aktual.
VxJasonxV
2
@ rxt: jika menemukan tidak menemukannya, itu tidak ada di sana ...
Robert S Ciaccio
5
Mengingat bahwa laporan OP telah mencoba menemukan dalam teks pertanyaan, perlu dicatat bahwa urutan argumen menjadi find penting . Jika harus find [path]+ [selection, grouping, and actions].
dmckee
23

find . -name '*.csv'misalnya bekerja untuk saya dengan wildcard. OP juga bisa menggunakan find . -name '*.dmg'untuk memeriksa direktori saat ini, dengan asumsi dia berada di /.

pamammer
sumber
6

Anda bisa menggunakan locateperintah.

locate abc.dmg
Wuffers
sumber
2
Perhatikan osxtag. slocate db tidak mengisi secara default.
VxJasonxV
Mencobanya, setelah membuat database, tetapi tidak ada hasil.
SPRBRN
jika locatedan mdfindkeduanya gagal, kemungkinan file tidak ada di mesin Anda. Atau tidak disebutkan bagaimana menurut Anda namanya. mungkin mencari SEMUA DMG mungkin langkah Anda selanjutnya?
peelman
3

Cara paling sederhana (yang saya yakin Anda sudah mencoba, tapi hei, biarkan saya menambahkannya ke utas) adalah dengan memasukkan abc.dmg ke dalam kotak pencarian di kanan atas jendela pencari apa pun, lalu pilih "File Nama "dari opsi di Bilah Pencarian yang muncul.

Tidak perlu untuk terminal.

Juga ingat bahwa Spotlight hanya mengindeks direktori yang ditentukan dalam panel kontrol Spotlight dan abc.dmg mungkin tidak ada di salah satu direktori tersebut.

Koreksi saya jika saya salah, tetapi saya pikir perintah find perlu tahu apa yang akan dihasilkan:

find / -name abc.dmg -print

... harus mencetak hasil apa pun ke terminal (termasuk kesalahan izin).

Jika Anda tidak ingin kesalahan izin dan ingin mencari direktori Pengguna lain maka:

sudo find / -name abc.dmg -print
Jupiter
sumber
2

Anda dapat menggunakan fungsi perintah berikut untuk menemukan dan membuka file yang relevan dengan cepat. Saya menemukan ini lebih mudah daripada mengetik string panjang query di jendela sorotan.

Tambahkan fungsi berikut di ~/.bash_aliases.

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='*$1*'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd" | sed -n "${FILEID}")"

}

Sekarang, source ~/.bash_aliasesbuka atau buka fungsi terminal load baru. Untuk mencari file dengan kata-kata, pie, dan 2016 di mana saja dalam nama file, lakukan

spot pie*2016 #or
spot 2016*pie

Tidak perlu menambahkan atau menambahkan *permintaan Anda sebagai pola pencarian, '*$1*'sudah menandai entri kartu liar di awal dan akhir permintaan Anda. Tambahan cdadalah untuk case sensitif dan mengabaikan tanda diakritik, misalnya, fredakan mengembalikan keduanya, Frédéric dan FrEDeric.

findpaperakan membatasi pencarian untuk hasil di bawah jalur tertentu (rekursif) sementara openpaper pie*201akan membuka (atau pertama dari beberapa hasil) hasil pencarian atau openpaper pie*201 3akan membuka entri hasil ketiga. Untuk menghindari membuka skrip bash atau file non-dokumen lainnya, Anda dapat membatasi konten file dengan atribut pencarian tambahan. Lihat Sintaks Ekspresi Kueri Metadata File dan https://ss64.com/osx/mdfind.html untuk menggunakan operator pencarian lainnya.

Samir
sumber
Luar biasa!
Menyimpannya
0

Tangkap daftar setiap file pada disk Anda sebagai root dari /

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

Cat seluruh file melalui grep untuk mencari seluruh drive:

cat ~/file-list.txt | grep abc.dmg

Gunakan ekspresi reguler untuk hanya menampilkan file .jpg dan .dmg:

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"

Hasil:

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg

... dll. Sayangnya juga akan menangkap semua disk yang dipasang sehingga yang terbaik untuk mengeluarkan Time Machine yang mereka punya banyak tautan. Jadi di jendela lain saya jalankan watch tail -n 10 ~/file-list.txtyang menunjukkan kepada saya di mana itu berada di hack pengecut saya!

Tomachi
sumber
1
Praktik buruk atau hal-hal yang pantas mendapat komentar: (1) sudo find / > ~/file-list.txttampaknya lebih baik daripada menjalankan seluruh shell sebagai root. (2) find *akan melewati objek tersembunyi (titik) (jika ada) di /. (3) &>adalah bashism. (4) Penggunaan yang tidak berguna cat. (5) grep abc.dmgakan mencetak misalnya /foo/bar/123abcXdmg456/baz/whatever. // Satu hal yang baik yang dibawa jawaban Anda ke utas ini (dan jawaban lainnya tidak) adalah pendekatan di mana pengguna menjalankan findsekali dan kemudian menggunakan kembali hasil yang disimpan berkali-kali tanpa menanyakan sistem file berulang kali. Keuntungan potensial ini tidak beraksen.
Kamil Maciorowski
Poin yang baik terima kasih Kamil, telah melakukan itu dan juga mengunyah $ (whoami)
Tomachi