temukan perintah di Linux untuk mencari file pdf

11

Tujuan saya adalah untuk menemukan semua file pdf pada mesin jarak jauh, jadi saya menggunakan perintah yang bermanfaat find. Jadi saya mengetik

cari ~ * .pdf
atau
temukan ~ "* .pdf"
dan saya tidak mendapatkan apa-apa. Saya melakukan hal yang sama pada mesin saya dan saya tidak mendapatkan apa-apa. Saya melakukan pencarian rutin dari menu di komputer saya dan saya menemukan beberapa file pdf. Bisakah seseorang tolong beri tahu saya apa yang saya lakukan salah?

akira
sumber
11
Simpan opini negatif Anda di luar pertanyaan Anda jika Anda menginginkan respons yang baik. Dalam cerita terkait, findjauh dari sia-sia.
wilhelmtell
8
Tentu saja Anda memiliki hak kebebasan berbicara. Tetapi Anda memang menginginkan respons yang baik, bukan? Tidak, Anda tidak memiliki hak untuk respons konstruktif yang baik. Itu adalah hak istimewa.
wilhelmtell
2
Pekerja yang buruk selalu menyalahkan alatnya. Dengan kata lain, PBCAK murni di sini.
Pascal Thivent
5
@ Willhelmtell, saya pikir pernyataan Martin adil - perintah itu seharusnya tidak bernama "find" di tempat pertama, lebih seperti "walkpath_and_execute" ... itu tidak memiliki antarmuka yang paling intuitif atau ramah pengguna dan jauh lebih banyak daripada sekadar mencari file. Nama sederhana "find" menipu karena menunjukkan antarmuka sederhana yang tidak dimilikinya. Tentu, menemukan jauh dari tidak berguna dan berfungsi dengan baik, tetapi orang tidak dapat menyalahkan seorang pemula karena tidak mengetahui perbedaan antara "menemukan", "menemukan", "yang", dll.
Michael Aaron Safyan
1
@Michael saya tidak menyalahkan siapa pun di sini; atau, lebih tepatnya, bukan aku yang menyalahkan di sini. Saya bahkan tidak mengatakan finditu intuitif. Saya mungkin bisa mengatakan hal yang sama dengan nada yang lebih baik; terkadang saya bereaksi terhadap komentar negatif (konyol).
wilhelmtell

Jawaban:

30

findjauh dari tidak berguna. Anda tidak menggunakannya dengan benar.

mencoba:

find . -type f -iname '*.pdf'

Mitch Dempsey
sumber
@ Martin - Senang membantu, pastikan untuk menandai pertanyaan sebagai dijawab!
Mitch Dempsey
@stepancheg Ya, mengapa Anda tidak menghapus internet dan mencetak salinannya.
bobobobo
9

Lihatlah dokumentasi untuk findutils . The findperintah salah satu yang sangat kuat dan, akibatnya, memiliki antarmuka yang agak rumit. Anda dapat melakukan apa yang Anda inginkan dengan:

find . -type f -iname '*.pdf' 

Perintah di atas berarti "temukan di dalam. Untuk entri file jenis dengan nama huruf besar-kecil yang cocok * .pdf (dan cetak nama pasangan tersebut)". Perintah find sebenarnya dapat digunakan untuk menjalankan perintah pada file yang ditemukan (alih-alih atau sebagai tambahan untuk mencetak nama file). Namun, untuk keperluan Anda, Anda mungkin merasa lebih nyaman dengan perintah loc , yang - dengan asumsi Anda telah membangun basis data loc menggunakan updatedb - membuatnya sangat mudah untuk menemukan file. Sebagai contoh:

locate '*.pdf'

Anda juga akan menemukan bahwa perintah loc biasanya lebih cepat daripada perintah find karena loc menggunakan indeks nama file (database loc), sedangkan find akan menjalankan hierarki untuk setiap permintaan.

Michael Aaron Safyan
sumber
6

Anda hanya melewatkan predikat yang mengatakan apa yang Anda cari (mis -name.)

Untuk menemukan di direktori home dengan nama:

find ~ -name \*.pdf

Perhatikan bahwa wildcard *harus melarikan diri sehingga shell tidak mengartikannya sebelum ditemukan. Menggunakan '*.pdf'dan "*.pdf"akan memiliki efek yang sama dengan \*.pdf.

Untuk menemukan case-insensitive:

find ~ -iname \*.pdf

Untuk memangkas hasil ke file saja (ekspresi nama mungkin akan menangani ini untuk Anda, tetapi kalau-kalau Anda memiliki direktori bernama aneh):

find ~ -type f -iname \*.pdf

Untuk memastikan menemukan, ikuti tautan simbolis (biasanya saya ingin melakukannya sendiri saat melakukan pencarian):

find ~ -follow -type f -iname \*.pdf

Untuk melakukan sesuatu dengan file yang Anda temukan: Anda dapat membuang ini ke file menggunakan stdout redirection (misalnya tack on > filenamedi akhir), atau gunakan -execopsi untuk menjalankan perintah (lihat halaman manual untuk detail). Yang terakhir menjalankan perintah pada setiap file sekaligus. seringkali lebih cepat membiarkan xargsperintah meneruskan file yang ditemukan sebagai argumen ke perintah lain, sekaligus atau potongan besar sekaligus. Misalnya, untuk ad-hoc (tetapi tidak terindeks) greps melalui file header:

find ~ -follow -type f -name \*.h | xargs grep -nH "identifier"

Dan satu ekstensi terakhir, untuk membuat perintah terakhir itu berfungsi dengan baik jika Anda memiliki file & direktori dengan spasi di dalamnya:

find ~ -follow -type f -name \*.h -print0 | xargs -0 grep -nH "identifier"
Owen S.
sumber
Sebenarnya, "* .pdf" akan berkembang jika ada file di direktori saat ini yang berakhir dengan .pdf, kan? (catatan kecil)
Peter Jaric
1
Tidak dalam bash. Dari manual bash: "Menutup karakter dalam tanda kutip ganda menjaga nilai literal semua karakter dalam tanda kutip, dengan pengecualian [dolar], [backquote], [pipa], dan, ketika ekspansi sejarah diaktifkan, [bang]. " Cobalah sendiri untuk mengonfirmasi: ls "* .txt" pada direktori dengan file teks di dalamnya.
Owen S.
Ya, tentu saja Anda benar. Saya tidak tahu dari mana saya mendapatkan ide itu. Terima kasih telah mengoreksi saya.
Peter Jaric
3

lihat tutorial ini

Saya pikir apa yang ingin Anda lakukan adalah

find . -name "*.pdf"

sumber
Anda harus menggunakan inameatribut untuk visi lorong yang lebih baik
Mitch Dempsey
0

Saya biasa menggabungkan find dengan grep like

Temukan . . | grep -i ".pdf"

mungkin tidak top efisien, tetapi itu berfungsi dengan baik.

Tiberiu Hajas
sumber
Hal ini dapat dilakukan dalam findlangsung jika Anda berharap, melalui -iregex: find ~ -iregex '.*\.pdf'. Masalahnya adalah, dalam findpola diperlakukan seperti itu selalu ada ^di depan dan $di belakang, sehingga pola Anda perlu sedikit lebih rumit. Perhatikan juga: bahwa .dalam pola Anda sebenarnya wildcard satu karakter, bukan periode literal.
Owen S.
0

Temukan file yang perlu Anda unduh dalam x hari terakhir

find ~ -type f -iname '*.pdf' -mtime -1

akan menemukan Anda file pdf di ~direktori home Anda dan di bawah ini dengan ekstensi .pdfterlepas dari huruf besar dan kecil (itu saya masuk iname) dan dimodifikasi hingga 1 hari yang lalu karena saya telah menambahkan mtime -1; jika Anda memasukkan -60 dalam waktu mtime, itu akan menjadi 60 hari terakhir.

r0berts
sumber
0

Untuk menjalankan pencarian dalam file "ditemukan" ada konstruksi ini:

find <dir> -type f -iname <name> -exec grep -H <string> {} \;

Perintah exec harus diakhiri dengan escaped ";" dan -H diperlukan untuk grep untuk mencetak path file di samping baris dalam file di mana "string" berada.

Ted Ballou
sumber