วิธีค้นหาไฟล์จากไดเรกทอรีใด ๆ


22

ฉันพยายามที่จะมองหาไฟล์ที่เรียกว่าBook1

ในการทดสอบของฉันฉันพยายามค้นหาไฟล์ดังกล่าวและในการทดสอบนี้ฉันไม่รู้ว่าไฟล์นั้นอยู่ที่ไหน

ฉันพยายามfind / -iname book1แต่ไม่มีผลลัพธ์

ฉันจะค้นหาไฟล์ชื่อ book1 โดยใช้บรรทัดคำสั่งได้อย่างไรหากฉันไม่รู้ว่าไฟล์อยู่ที่ไหน

แก้ไข:

สถานการณ์ของฉันอธิบายไว้ในรายละเอียดเพิ่มเติมด้านล่าง:

  1. ไม่รู้จักนามสกุลไฟล์
  2. ไม่ทราบชื่อที่แน่นอน (เช่นตัวพิมพ์ใหญ่ตัวเลขและอื่น ๆ )
  3. ไม่ทราบตำแหน่งของไฟล์

2
หากมีไฟล์ชื่อBook1และอยู่ในไดเรกทอรีที่คุณสามารถอ่านได้จากนั้นfind / -iname book1จะค้นหาไฟล์นั้น คุณแน่ใจว่ามันเป็นจริงBook1และไม่Book1.xyz?
Fox

ชื่อเต็มของไฟล์คือ Book1.gnumeric คุณกำลังบอกว่าฉันต้องระบุชื่อเต็มของไฟล์หรือไม่? ด้วยเหตุผลบางอย่างที่ฉันคิดว่าสำหรับคำสั่งเฉพาะนี้สิ่งที่ฉันต้องการคือชื่อไฟล์ การทดสอบของฉันพยายามค้นหาไฟล์ถ้าเป็นเช่นนั้นฉันจำไม่ได้ว่านามสกุลไฟล์นั้นและรู้จักชื่อไฟล์ที่ฉันกำลังค้นหา กรุณาแนะนำ
Aspire 27

@don_crissti เรียบร้อยแล้ว โปรดดูด้านบนแก้ไข
Aspire 27

คุณกำลังผสมและfind มีน้ำใจและจะพบสิ่งที่ตรงกับตราบใดที่มันอยู่ในฐานข้อมูลซึ่งโดยปกติจะอัพเดททุกวัน ในกรณีนี้คือการมองหา glob แฟ้มเรียงลำดับของรูปแบบที่คุณจะใช้ใน คุณอาจหมายถึง โปรดทราบว่ารูปแบบต้องอยู่ในเครื่องหมายคำพูดเพื่อหยุดการขยายเชลล์ก่อนที่จะเห็น โปรดสังเกตด้วยว่าเช่นเดียวกับคำสั่ง * จำนวนมากห้ามนิ่งเงียบเมื่อไม่สำเร็จ locatelocatefindlsiname '*book1*'findfind
Manngo

คำตอบ:


31

ครั้งแรกอาร์กิวเมนต์-inameเป็นเปลือกรูปแบบ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับรูปแบบในคู่มือการทุบตี ส่วนสำคัญคือเพื่อหาไฟล์findจริงชื่อไฟล์จะต้องตรงกับรูปแบบที่ระบุ ในการสร้างสตริงที่ไม่ต้องตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็กคุณจะต้องเพิ่มเพื่อให้มีลักษณะดังนี้:book1Book1.gnumeric*

find / -iname 'book1*'

หรือระบุชื่อเต็ม:

find / -iname 'Book1.gnumeric'

ประการที่สอง-inameจะทำให้findไม่สนใจกรณีที่ชื่อไฟล์ดังนั้นหากคุณระบุ-iname book1ก็ยังอาจพบBook1, bOok1ฯลฯ หากคุณแน่ใจว่าไฟล์คุณกำลังมองหาที่เรียกว่าBook1.gnumeric แล้วไม่ได้ใช้-inameแต่-nameมันจะเร็วขึ้น:

find / -name 'Book1.gnumeric'

ประการที่สามจำเกี่ยวกับรูปแบบการอ้างเช่นกล่าวว่าในคำตอบอื่น

และสุดท้าย - คุณแน่ใจหรือไม่ว่าคุณต้องการค้นหาไฟล์ ทุกที่ในระบบของคุณ? เป็นไปได้ว่าไฟล์ที่คุณกำลังค้นหานั้นอยู่ใน$HOMEไดเรกทอรีของคุณหากคุณใช้ไฟล์ดังกล่าวหรือดาวน์โหลดจากที่อื่น อีกครั้งที่อาจเร็วกว่ามาก

แก้ไข :

ฉันสังเกตเห็นว่าคุณแก้ไขคำถามของคุณ หากคุณไม่รู้จักชื่อไฟล์เต็มการใช้อักษรตัวพิมพ์ใหญ่และตำแหน่งแน่นอนคุณควรใช้สิ่งนี้

find / -iname 'book1*'

ฉันขอแนะนำให้วาง2>/dev/nullที่ท้ายบรรทัดเพื่อซ่อน*permission denied*ข้อผิดพลาดทั้งหมดและอื่น ๆ ที่จะปรากฏถ้าคุณเรียกใช้findในฐานะผู้ใช้ที่ไม่ใช่รูท:

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

และหากคุณแน่ใจว่าคุณกำลังมองหาไฟล์เดียวและมีเพียงไฟล์เดียวในระบบของคุณที่ตรงกับเกณฑ์ที่คุณสามารถบอกfindให้ออกหลังจากค้นหาไฟล์ที่ตรงกันแรก:

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


6

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

หากต้องการค้นหาไฟล์ที่ตรงกันทั้งหมด*book1*และไม่สนใจขนาดตัวพิมพ์คุณสามารถใช้

locate -i book1

หากคุณต้องการค้นหาไฟล์ที่ขึ้นต้นด้วยbook1คุณจะต้องใช้อักขระตัวแทน:

locate -i 'book1*'

มันเร็วกว่าfindมาก แต่เป็นข้อมูลล่าสุดตามเวลาล่าสุดที่ฐานข้อมูลถูกรีเฟรช


5

หากคุณรู้ว่าคุณมีไฟล์ชื่อbook1.somethingตำแหน่งไฟล์ที่แน่นอนsomethingและรูปแบบการใช้อักษรตัวพิมพ์ใหญ่ของชื่อไฟล์จะไม่ทราบทั้งหมด:

find / -iname 'book1.*'

หากสิ่งที่คุณรู้ทั้งหมดคือชื่อไฟล์มีคำว่าbookคุณสามารถสร้างรายการที่มีขนาดใหญ่กว่าได้

find / -iname '*book*'

อาร์กิวเมนต์ที่-nameเป็นรูปแบบเปลือก glob จากไดเร็กทอรีที่มีไฟล์อยู่ให้เปรียบเทียบ:

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

-nameนี้แสดงให้เห็นชนิดของการค้นหาที่ดำเนินการโดย -inameตัวเลือกเพียงแค่ช่วยให้รุ่นกรณีตายนี้


1

POSIXly,

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

จะรายงานเส้นทางของไฟล์ทั้งหมดที่มีชื่อมีbook1(ที่มีรูปแบบของกรณีใด ๆ แต่การพิจารณาตัวอักษรละติน ASCII bokBOKไม่ใช่รูปแบบอื่น ๆ อีกมากมายใน Unicode เช่น𝗄, 𝚔, 𝘬, , , , และทุกรูปแบบของพวกเขาด้วยการออกเสียง ... ) ใน ไดเรกทอรีทั้งหมดที่คุณมีสิทธิ์เข้าถึงเพื่ออ่าน


0

สำหรับงานประเภทนี้ฉันมักจะทำ: find / -iregex '.*Book1.*'

แบบฟอร์มนี้จะดูแลจุด 3 จุดของสถานการณ์ของคุณ ( iregexเป็นนิพจน์เหตุผลที่ไม่ตรงตามตัวพิมพ์เล็กและลวดลายที่มี.*ทั้งสองด้านจะจับคู่กับอักขระใด ๆ ก่อนและหลังรูปแบบคงที่ของ Book1 - นี่อาจทำให้คุณได้ผลลัพธ์มากกว่าที่จำเป็น แต่คุณไม่ควรพลาดไฟล์)

ความแตกต่างสำคัญ: ถ้าเป็นไปได้จะเข้มงวดมากขึ้นกว่าเพียงแค่ใช้/เช่นพยายามเท่านั้น/homeหรือเพื่อมิฉะนั้นคุณจะลงมาในบางไดเรกทอรีที่ไม่เกี่ยวข้อง ( /sys, /devฯลฯ ... )

โปรดจำไว้ว่าการใช้ Unix จะใช้สิทธิ์: หากไฟล์อยู่ในไดเรกทอรีที่ผู้ใช้ที่รันfindคำสั่งไม่มีสิทธิ์ในการเข้าถึง (เรียกใช้) findจะไม่สามารถค้นหาได้


iregex จะไม่ทำงานในสถานที่เช่น Solaris (ไม่ได้ระบุระบบปฏิบัติการ) (และอาจเป็น * BSD) เป็นส่วนขยาย GNU และไม่ได้เป็นส่วนหนึ่งของมาตรฐานfind
Gert van den Berg

0

Silver Searcherเป็นเครื่องมือที่รวดเร็วและสะดวกในการค้นหาไฟล์และเนื้อหา

เพื่อแก้ปัญหาของคุณคำสั่ง silver searcher จะมีลักษณะเช่นนี้ ...

ag -g Book1

-g PATTERN พิมพ์ชื่อไฟล์ที่ตรงกับรูปแบบ


0

locate และสายพันธุ์ของมันมีแนวโน้มที่จะเป็นวิธีที่รวดเร็ว

# 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

หากค้นหาไม่พร้อมใช้งานคุณสามารถใช้findแทน มันมักจะช้ากว่า แต่ก็แม่นยำกว่ามาก

หากคุณมีพาร์ติชันเดียว: (เรียกใช้เป็นรูทหากผู้ใช้ของคุณอาจไม่สามารถเข้าถึงไฟล์ได้)

$ 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

หากคุณไม่รวม-xdev findสิ่งที่ค้นหาในพาร์ทิชันอื่น ๆ เช่น/procและ/sysซึ่งมีแนวโน้มที่จะทำให้หน้าจอของคุณมีข้อผิดพลาดโดยเฉพาะอย่างยิ่งถ้าคุณไม่รูท (ข้อผิดพลาดสามารถซ่อนได้โดยต่อท้าย2> /dev/nullคำสั่ง find (ควรลบความคิดเห็น))

หากคุณมีหลายพาร์ติชันและคุณไม่ทราบว่ามีไฟล์ใดอยู่คุณสามารถรับรายการด้วยlsblk(บนระบบปฏิบัติการบน Linux, การแยกวิเคราะห์dfเอาท์พุทเป็นตัวเลือกอย่างอื่น) และฟีดลงใน find: (รูทอีกครั้งถ้าคุณ ไม่ทราบว่าคุณสามารถเข้าถึงไฟล์ได้หรือไม่)

$ 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.

(นี่เป็นบิตที่เปราะบางหากหนึ่งในจุดเมาท์ของคุณมีช่องว่าง) ( dfพารามิเตอร์อาจต้องปรับแต่ง - P ทำให้ GNU dfให้เอาต์พุต POSIX มาตรฐานรุ่นอื่น ๆ อาจมีพารามิเตอร์อื่น ๆ หรือต้องการให้อ่านหน้าคนของคุณ)

grep -Fไม่รวมสิ่งอื่น ๆ กลับมาเช่นเดียวกับพาร์ทิชันแลกเปลี่ยน

ในเวอร์ชันที่ไม่ใช่ GNU ให้ awk ค้นหาอุปกรณ์ที่มีการเมานต์เริ่มต้น/devเพื่อรับระบบไฟล์จริงจากนั้นพิมพ์ฟิลด์สุดท้าย (จุดเมานท์) จากdfเอาต์พุต

สิ่งนี้จะถือว่าเชลล์คล้าย bourne ( kshและbashควรใช้งานถ้าคุณใช้cshตัวแปรให้เริ่มเชลล์เชลล์แบบสคริปต์ได้ก่อนที่จะลอง)


greps อาจจะมีเสียงดังบิตเรียนรู้วิธีการกรอง ที่ดีกว่า (นี้ไม่ควรมีความจำเป็นด้วยตัวอย่าง แต่ถ้ามันเป็นสิ่งที่พบได้บ่อยมากขึ้นที่จะมองหา greps จะต้องปรับแต่งเพื่อให้ระดับเสียงลง)
เกิร์ต van den Berg

0

ag (ผู้ค้นหาซิลเวอร์)ให้การค้นหาไฟล์ที่รวดเร็วและยังมีตัวเลือกในการค้นหาชื่อไฟล์:

>: 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

ดังนั้นในกรณีการใช้งานของฉันที่นี่มันเร็วกว่า 30 เท่าหากไฟล์นั้นไม่ใช่ไฟล์ที่ถูกละเว้นโดย ag

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