ค้นหาคำสั่งใน Linux เพื่อค้นหาไฟล์ pdf


11

เป้าหมายของฉันคือการหาไฟล์ PDF findทั้งหมดบนเครื่องระยะไกลดังนั้นผมจึงหันไปใช้คำสั่งที่มีประโยชน์ ดังนั้นฉันพิมพ์

ค้นหา ~ * .pdf
หรือ
ค้นหา ~ "* .pdf"
และฉันก็ไม่ได้อะไรเลย ฉันทำแบบเดียวกันกับเครื่องและไม่ได้อะไรเลย ฉันค้นหาจากเมนูบนเครื่องของฉันเป็นประจำและพบไฟล์ PDF จำนวนเล็กน้อย มีคนช่วยบอกฉันทีว่าฉันทำอะไรผิด


11
เก็บความคิดเห็นเชิงลบไว้นอกคำถามของคุณหากคุณต้องการคำตอบที่ดี ในเรื่องที่เกี่ยวข้องfindอยู่ไกลจากไร้ประโยชน์
wilhelmtell

8
แน่นอนคุณมีสิทธิในการพูดฟรี แต่คุณต้องการการตอบรับที่ดีใช่ไหม ไม่คุณไม่มีสิทธิ์ในการตอบรับที่สร้างสรรค์ นั่นคือสิทธิพิเศษ
wilhelmtell

2
คนงานที่ไม่ดีมักตำหนิเครื่องมือของเขา ในคำอื่น ๆ บริสุทธิ์PBCAKที่นี่
Pascal Thivent

5
@ Wilhelmtell ฉันคิดว่าคำสั่งของ Martin นั้นยุติธรรม - คำสั่งไม่ควรถูกตั้งชื่อว่า "find" ในตอนแรกเหมือน "walkpath_and_execute" มากกว่า ... มันไม่มีอินเตอร์เฟสที่ใช้งานง่ายหรือเป็นมิตรกับผู้ใช้ เพียงแค่ค้นหาไฟล์ ชื่อ "ค้นหา" อย่างง่ายนั้นเป็นการหลอกลวงซึ่งเป็นการแนะนำอินเทอร์เฟซพื้นฐานที่ไม่มี แน่นอนว่าการค้นหานั้นไกลจากไร้ประโยชน์และทำงานได้ดี แต่แทบจะไม่สามารถตำหนิผู้เริ่มต้นที่ไม่ทราบความแตกต่างระหว่าง "ค้นหา", "ค้นหา", "ที่" ฯลฯ "
Michael Aaron Safyan

1
@Michael ฉันไม่ได้ตำหนิใครที่นี่; หรือฉันไม่ได้เป็นคนทำโทษที่นี่ ฉันไม่ได้บอกว่าfindใช้งานง่าย ฉันอาจจะพูดสิ่งเดียวกันด้วยน้ำเสียงที่ดีกว่า บางครั้งฉันตอบสนองต่อความคิดเห็นเชิงลบ (โง่)
wilhelmtell

คำตอบ:


30

findอยู่ไกลจากไร้ประโยชน์ คุณไม่ได้ใช้งานอย่างถูกต้อง

ลอง:

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


@ มาร์ติน - มีความสุขที่จะช่วยเพียงแค่ทำเครื่องหมายคำถามว่าตอบแล้ว!
Mitch Dempsey

@stepancheg ใช่ทำไมคุณไม่ลองอินเทอร์เน็ตและพิมพ์เอกสาร
bobobobo

9

ลองดูที่เอกสารสำหรับการfindutils findคำสั่งเป็นหนึ่งที่มีประสิทธิภาพอย่างเหลือเชื่อและจึงมีอินเตอร์เฟซที่ค่อนข้างซับซ้อน คุณสามารถทำสิ่งที่คุณต้องการด้วย:

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

คำสั่งดังกล่าวหมายถึง "ค้นหาภายในสำหรับรายการประเภทไฟล์ที่มีชื่อตรงกับตัวพิมพ์เล็กและใหญ่ที่ตรงกับ * .pdf (และพิมพ์ชื่อของการแข่งขันดังกล่าว)" คำสั่ง find สามารถใช้เพื่อเรียกใช้คำสั่งบนไฟล์ที่พบได้ (แทนหรือนอกเหนือจากการพิมพ์ชื่อไฟล์) อย่างไรก็ตามสำหรับวัตถุประสงค์ของคุณคุณอาจรู้สึกว่าตัวเองมีความสะดวกสบายมากขึ้นด้วยคำสั่งค้นหาซึ่งถ้าคุณสร้างฐานข้อมูลค้นหาโดยใช้updatedbทำให้สามารถค้นหาไฟล์ได้ง่าย ตัวอย่างเช่น:

locate '*.pdf'

นอกจากนี้คุณยังจะพบว่าคำสั่งค้นหานั้นเร็วกว่าคำสั่ง find เนื่องจากการค้นหาใช้ดัชนีของชื่อไฟล์ (ฐานข้อมูลค้นหา) ในขณะที่การค้นหาจะดำเนินการตามลำดับชั้นสำหรับการเรียกใช้แต่ละครั้ง


6

คุณไม่มีภาคแสดงที่ระบุสิ่งที่คุณกำลังค้นหา (เช่น-name)

วิธีค้นหาในโฮมไดเรกทอรีตามชื่อ:

find ~ -name \*.pdf

โปรดทราบว่า*จะต้องใช้อักขระตัวแทนเพื่อหลีกเลี่ยงการใช้เปลือกเพื่อแปลความหมายก่อนที่การค้นหาจะได้รับในมือ การใช้'*.pdf'และจะมีผลเช่นเดียวกับ"*.pdf"\*.pdf

หากต้องการค้นหาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่:

find ~ -iname \*.pdf

หากต้องการตัดผลลัพธ์ไปที่ไฟล์เท่านั้น (นิพจน์ชื่ออาจดูแลสิ่งนี้ให้คุณ แต่ในกรณีที่คุณมีไดเรกทอรีที่มีชื่อแปลก ๆ ):

find ~ -type f -iname \*.pdf

เพื่อให้แน่ใจว่าค้นหาตามลิงก์สัญลักษณ์ (โดยปกติฉันต้องการทำสิ่งนี้ด้วยตัวเองเมื่อทำการค้นหา):

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

ในการทำบางสิ่งบางอย่างกับไฟล์ที่คุณพบ: คุณสามารถดัมพ์นี้ไปยังไฟล์โดยใช้การเปลี่ยนเส้นทาง stdout (เช่นแทค> filenameที่ส่วนท้าย) หรือใช้-execตัวเลือกเพื่อเรียกใช้คำสั่ง (ดูหน้ารายละเอียด man man) หลังเรียกใช้คำสั่งในแต่ละไฟล์ในเวลาแม้ว่า บ่อยครั้งที่มันเร็วกว่าที่จะให้xargsคำสั่งส่งไฟล์ที่คุณพบเป็นอาร์กิวเมนต์ไปยังคำสั่งอื่นทั้งหมดในครั้งเดียวหรือชิ้นใหญ่ทีละครั้ง ตัวอย่างเช่นสำหรับ ad-hoc (แต่ไม่ได้ทำดัชนี) greps ผ่านไฟล์ส่วนหัว:

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

และหนึ่งนามสกุลสุดท้ายเพื่อให้คำสั่งสุดท้ายนั้นทำงานได้อย่างถูกต้องหากคุณมีไฟล์ & ไดเรกทอรีที่มีช่องว่างอยู่:

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

ที่จริงแล้ว "* .pdf" จะขยายถ้ามีไฟล์ในไดเรกทอรีปัจจุบันที่ลงท้ายด้วย. pdf ใช่ไหม (หมายเหตุเล็กน้อย)
Peter Jaric

1
ไม่ได้อยู่ในทุบตี จากคู่มือทุบตี: "การใส่อักขระในเครื่องหมายอัญประกาศคู่จะรักษาคุณค่าตามตัวอักษรของอักขระทั้งหมดภายในเครื่องหมายคำพูดยกเว้น [dollar], [backquote], [pipe] และเมื่อเปิดใช้งานการขยายประวัติ [bang] " ลองด้วยตัวคุณเองเพื่อยืนยัน: ls "* .txt" ในไดเรกทอรีที่มีไฟล์ข้อความอยู่
โอเว่นเอส.

ใช่คุณพูดถูก ฉันไม่รู้ว่าฉันได้รับความคิดนั้นจากที่ใด ขอบคุณสำหรับการแก้ไขฉัน
Peter Jaric

3

ลองดูที่บทช่วยสอนนี้

ฉันคิดว่าสิ่งที่คุณต้องการจะทำคือ

find . -name "*.pdf"

คุณควรใช้inameคุณลักษณะเพื่อการมองเห็นห้องโถงที่ดีขึ้น
Mitch Dempsey

0

ฉันเคยรวมการค้นหากับ grep like

หา . | grep -i ".pdf"

อาจจะไม่ได้ประสิทธิภาพสูงสุด แต่ก็ทำงานได้ดี


นี้สามารถทำได้ในfindโดยตรงหากคุณอยากผ่าน:-iregex find ~ -iregex '.*\.pdf'ปัญหาคือในfindรูปแบบที่ได้รับการปฏิบัติเหมือนมันมักจะมี^ที่ด้านหน้าและ$ด้านหลังดังนั้นรูปแบบของคุณจะต้องซับซ้อนขึ้นเล็กน้อย โปรดทราบว่า.ในรูปแบบของคุณเป็นอักขระตัวแทนจริงไม่ใช่ระยะเวลาตัวอักษร
โอเว่นเอส.

0

ค้นหาไฟล์ที่คุณต้องการดาวน์โหลดภายใน x วันล่าสุด

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

จะพบไฟล์ pdf ของคุณในโฮมไดเร็กตอรี่ของคุณ~และด้านล่างพร้อมส่วนขยาย.pdfโดยไม่คำนึงถึงตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก (นั่นคือในiname) และแก้ไขได้ไม่เกิน 1 วันที่ผ่านมาเพราะฉันได้เพิ่มmtime -1; หากคุณใส่ -60 ใน mtime จะเป็น 60 วันที่ผ่านมา


0

หากต้องการดำเนินการค้นหาภายในไฟล์ "พบ" มีโครงสร้างนี้:

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

คำสั่ง exec ต้องจบด้วยการหลบหนี ";" และ -H จำเป็นสำหรับ grep เพื่อพิมพ์พา ธ ไฟล์เพิ่มเติมจากบรรทัดภายในไฟล์ที่มี "string"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.