Bagaimana menemukan file di sistem file dari baris perintah?

10

Saya ingin mencari di mana file (dengan nama file yang diketahui sebagian) ada di sistem file. Saya ingin tahu bagaimana melakukan ini dari baris perintah, daripada menggunakan utilitas GUI.

Di Windows, saya menjalankan yang berikut ini:

cd /d C:\
dir *filename* /s

Apa yang setara dengan Linux?

Iszi
sumber
Ya, jelas ada lebih dari satu cara untuk menguliti kucing ini . Saya masih sedikit penasaran untuk mengetahui apakah ada cara untuk melakukannya ls?
Iszi

Jawaban:

13
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*

(Baca terus untuk syarat dan ketentuan utama. Baca manual untuk cetakan halus.)

Daftar isi direktori adalah jenis fitur sekunder ls. Pekerjaan utama ls, salah satu yang paling rumit, adalah menyempurnakan tampilannya. (Lihatlah manual dan membandingkan jumlah pilihan yang berhubungan dengan memilih file apa untuk menampilkan vs jumlah pilihan yang kontrol apa informasi ke layar tentang setiap file dan bagaimana tampilan diformat. Hal ini berlaku baik dari ls GNU yang Anda' akan ditemukan di Linux, dan sistem lain dengan pilihan lebih sedikit, sejak awal .)

Mode default lsadalah ketika Anda mengirimkannya direktori, itu daftar file dalam direktori itu. Jika Anda meneruskannya jenis file lain (file biasa, tautan simbolik, dll.), Itu hanya daftar file itu. (Ini berlaku untuk setiap argumen secara terpisah.) Opsi -dmemberitahu lstidak pernah turun ke direktori.

lsmemang memiliki opsi -Ryang memberitahu itu untuk membuat daftar direktori secara rekursif. Tetapi penerapannya terbatas, dan tidak memungkinkan banyak penyaringan pada output.

Alat pertama yang melakukan pencocokan pola adalah shell itu sendiri. Anda tidak memerlukan perintah lain: cukup ketik wildcard Anda dan Anda siap. Ini dikenal sebagai globbing .

echo *filename*

Secara tradisional, wildcard terbatas pada direktori saat ini (atau direktori yang ditunjukkan:) echo /some/where/*filename*. A *cocok dengan nama file apa pun, atau bagian mana pun dari nama file, tetapi *.txttidak akan cocok foo/bar.txt. Kerang modern telah menambahkan pola **/yang berarti "dalam direktori ini, atau dalam direktori apa pun di bawahnya (secara rekursif)". Dengan bash, untuk alasan kompatibilitas historis, fitur ini perlu diaktifkan secara eksplisit shopt -s globstar(Anda dapat meletakkan baris ini di Anda ~/.bashrc).

echo **/*filename*

The echoperintah hanya menggemakan daftar nama file yang dihasilkan oleh shell kembali pada Anda. Sebagai pengecualian, jika tidak ada nama file yang cocok sama sekali, pola wildcard dibiarkan tidak berubah dalam bash (kecuali jika Anda mengatur shopt -s nullglob, dalam hal ini pola meluas ke daftar kosong), dan zsh memberi sinyal kesalahan (kecuali Anda mengatur setopt nullglob, atau setopt no_no_matchyang menyebabkan pola dibiarkan tidak berubah).

Anda mungkin masih ingin menggunakan lsuntuk opsi-opsinya. Misalnya, lsdapat memberikan indikasi tentang sifat atau izin file (direktori, executable, dll.) Melalui warna. Anda mungkin ingin menampilkan tanggal, ukuran, dan kepemilikan file ls -l. Lihat manual untuk lebih banyak opsi.

Perintah tradisional untuk mencari file di pohon direktori adalah find. Muncul dengan banyak opsi untuk mengontrol file mana yang akan ditampilkan dan apa yang harus dilakukan dengan mereka. Misalnya, untuk mencari file yang namanya cocok dengan pola *filename*di direktori saat ini dan subdirektori dan cetak namanya:

find /some/dir -name '*filename*' -print

-printadalah tindakan (sebagian besar tindakan lain terdiri dari mengeksekusi perintah pada file); jika Anda tidak melakukan tindakan, -printtersirat. Juga, jika Anda tidak menentukan direktori apa pun untuk dilintasi (di /some/diratas), direktori saat ini tersirat. Kondisi -name '*filename'mengatakan untuk mendaftar (atau bertindak) hanya file yang namanya cocok dengan pola itu; ada banyak filter lain, seperti -mtime -1mencocokkan file yang dimodifikasi dalam 24 jam terakhir. Terkadang Anda dapat menghilangkan tanda kutip -name '*filename*', tetapi hanya jika wildcard tidak cocok dengan file apa pun di direktori saat ini (lihat di atas). Singkatnya, bentuk singkatnya adalah

find -name '*filename*'

Alat lain yang bermanfaat ketika Anda tahu (bagian dari) nama file adalah locate. Alat ini menanyakan basis data nama file. Pada sistem yang khas, ini disegarkan setiap malam. Keuntungan locatelebih dari find /itu adalah jauh lebih cepat. Kelemahannya adalah informasinya mungkin basi. Ada beberapa implementasi locateyang berbeda dalam perilakunya pada sistem multi-pengguna: locateprogram dasar hanya mengindeks file yang dapat dibaca untuk umum (Anda mungkin ingin menjalankan pendamping updatedbuntuk membuat database kedua yang mengindeks semua file di akun Anda); ada versi lain (mlocate, slocate) yang mengindeks semua file dan locateprogram menyaring database untuk hanya mengembalikan file yang dapat Anda lihat.

locate filename

Terkadang Anda berpikir bahwa file disediakan oleh paket dalam distribusi Anda, Anda tahu (bagian dari) nama file tetapi bukan nama paket Anda, dan Anda ingin menginstal paket. Banyak distribusi menyediakan alat untuk itu. Di Ubuntu, itu apt-file search filename. Untuk perintah yang setara pada sistem lain, periksa Pacman Rosetta .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Seandainya aku bisa memilih lagi ini. Hanya harus mencari ini untuk proyek lain malam ini. Sekali lagi terima kasih, @Gilles!
Iszi
6

setara dengan contoh DOS Anda adalah:

cd /
find . -name \*filename\* -print

Di Linux, Anda biasanya tidak membutuhkan -printargumen, lagi. Jika Anda menemukan diri Anda bekerja pada sistem operasi lain, mungkin berguna untuk mengetahuinya.

Tim Kennedy
sumber
5

Jika Anda menginginkan sesuatu yang "cepat" , tetapi tidak dalam situasi kritis misi dan Anda hanya ingin tahu apakah itu ada dan di mana itu, Anda dapat menggunakannya locate. Itu menyimpan basis data semua file di direktori yang telah Anda suruh untuk mengumpulkan informasi.

Dalam pemasangan default (di Ubuntu), locateatur cronpekerjaan harian yang memindai sistem file dan memperbarui basis data ...

Jika Anda merasa perlu memperbarui basis data sebelum pembaruan cron berikutnya, biasanya lebih cepat dari findatau lshanya menjalankan sudo updatedblalu locate. Sudah pasti lebih cepat jika Anda perlu melakukan lebih banyak pencarian ... seperti namanya, updatedbmemperbarui database yang locatemenggunakan ...

locatememiliki built-in regex, yang membuatnya sangat berguna ... Saya akan menggunakan findskrip, tapi saya jarang menggunakannya finddi commandline. Saya bahkan menggunakan locateskrip (pribadi) ... mis.locate -bir "oo.*datt.*mp4$"

locate mengembalikan jalur yang sepenuhnya memenuhi syarat dari file yang cocok.

Peter.O
sumber
2
find [path] -name [filename]

Sebagai contoh, jika saya ingin mencari direktori / home untuk nama file yang mengandung foo, saya akan menggunakan perintah:

find /home -name *foo*

gunakan perintah man finduntuk info lebih lanjut tentang perintah temukan dan argumen,

josh-cain
sumber
3
Anda perlu mengutip atau melepaskan *s untuk mencegah shell menafsirkannya.
Shawn J. Goff
Apakah itu khusus distro / shell? Saya menjalankannya di Fedora 16 tanpa lolos dan itu bekerja dengan baik.
josh-cain
1
Ada beberapa opsi dalam beberapa shell yang meneruskan bintang ke program jika tidak cocok dengan apa pun. Coba buat file di direktori Anda saat ini yang cocok dengan pola itu, dan coba perintah lagi.
Shawn J. Goff