ฉันจะค้นหาไฟล์ทั้งหมดในปัจจุบันและโฟลเดอร์ย่อยซ้ำโดยอ้างอิงจากการจับคู่ไวด์การ์ดได้อย่างไร
ฉันจะค้นหาไฟล์ทั้งหมดในปัจจุบันและโฟลเดอร์ย่อยซ้ำโดยอ้างอิงจากการจับคู่ไวด์การ์ดได้อย่างไร
คำตอบ:
ใช้ค้นหาสิ่งต่อไปนี้:
find . -name "foo*"
findต้องการจุดเริ่มต้นและ.จุด (จุด) ไปยังไดเรกทอรีปัจจุบัน
find . foo*สิ่งfoo*นั้นจะถูกขยายออกและจากนั้นก็ผ่านไปเพื่อค้นหา
" "จำเป็นสำหรับการค้นหาแบบเรียกซ้ำ
find . -name "foo*" 2>/dev/null
การหาท่อเข้าสู่ grep มักจะสะดวกกว่า มันให้พลังเต็มที่ของการแสดงออกปกติสำหรับการจับคู่ไวด์การ์ดโดยพลการ
ตัวอย่างเช่นหากต้องการค้นหาไฟล์ทั้งหมดที่มีสตริงที่ไม่สนใจขนาดตัวพิมพ์ "foo" ในชื่อไฟล์:
~$ find . -print | grep -i foo
findนอกจากนี้ยังมี-iname, -regexและ-iregexธงสัญลักษณ์แทนสำหรับกรณีตาย regex และกรณีตายจับคู่ regex ดังนั้นท่อจะgrepไม่จำเป็น
findคำสั่งที่รองรับตัวเลือกเหล่านั้น บางครั้งgrepกลายเป็นตัวเลือกเท่านั้น
find จะค้นหาไฟล์ทั้งหมดที่ตรงกับรูปแบบ:
find . -name "*foo"
อย่างไรก็ตามหากคุณต้องการรูปภาพ:
tree -P "*foo"
หวังว่านี่จะช่วยได้!
brew install treeสำหรับผู้ใช้ Mac OSX ที่ไม่มีการapt-getติดตั้ง
find -L . -name "foo*"
ในบางกรณีฉันต้องการพารามิเตอร์ -L เพื่อจัดการลิงก์ไดเรกทอรีสัญลักษณ์ โดยลิงก์สัญลักษณ์เริ่มต้นจะถูกละเว้น ในกรณีเหล่านั้นค่อนข้างสับสนเพราะฉันจะเปลี่ยนไดเรกทอรีเป็นไดเรกทอรีย่อยและดูไฟล์ที่ตรงกับรูปแบบ แต่การค้นหาจะไม่ส่งคืนชื่อไฟล์ การใช้ -L แก้ปัญหานั้น ตัวเลือกลิงก์สัญลักษณ์สำหรับค้นหาคือ -P -L -H
หากเชลล์ของคุณรองรับตัวเลือก globbing ใหม่ (สามารถเปิดใช้งานโดย:)shopt -s globstarคุณสามารถใช้:
echo **/*foo*
เพื่อค้นหาไฟล์หรือโฟลเดอร์ซ้ำ ๆ นี้รองรับโดย Bash 4, zsh และเชลล์ที่คล้ายกัน
โดยส่วนตัวแล้วฉันได้ฟังก์ชั่นเชลล์นี้มาแล้ว:
f() { find . -name "*$1*"; }
หมายเหตุ: บรรทัดด้านบนสามารถวางโดยตรงไปยังเชลล์หรือเพิ่มลงใน~/.bashrcไฟล์ของผู้ใช้ของคุณ
จากนั้นฉันสามารถค้นหาไฟล์ใด ๆ โดยพิมพ์:
f some_name
หรือคุณสามารถใช้fdยูทิลิตี้fd patternที่มีไวยากรณ์ง่ายเช่น
shopt -s globstarคำสั่ง สิ่งนี้ได้รับการสนับสนุนใน Bash, zsh และเชลล์ที่คล้ายกัน
bash-3.2$ shopt -s globstarให้bash: shopt: globstar: invalid shell option name
fdในกรณีที่findช้าเกินไปให้ลองใช้fdยูทิลิตี้ซึ่งเป็นทางเลือกที่ง่ายและรวดเร็วfindเขียนใน Rust
ไวยากรณ์:
fd PATTERN
การสาธิต:
หน้าแรก: https://github.com/sharkdp/fd
asciicast2vectorใช้งานได้
find <directory_path> -type f -name "<wildcard-match>"
ใน wildcard-match คุณสามารถระบุสตริงที่คุณต้องการจับคู่เช่น * .c (สำหรับไฟล์ c ทั้งหมด)
คุณสามารถใช้ได้:
# find . -type f -name 'text_for_search'
หากคุณต้องการใช้การใช้ REGX -iname
# find . -type f -iname 'text_for_search'
คำสั่งดังต่อไปนี้จะแสดงรายการไฟล์ทั้งหมดที่มีชื่อ "รูปแบบ" ที่แน่นอน (ตัวอย่าง) ในปัจจุบันและโฟลเดอร์ย่อย
find ./ -name "pattern"
วิธีเริ่มต้นในการค้นหาไฟล์วนซ้ำและส่วนใหญ่จะมีให้ใช้งาน
find . -name "filepattern"
มันจะเริ่มการวนซ้ำแบบเรียกซ้ำสำหรับชื่อไฟล์หรือรูปแบบจากภายในไดเรกทอรีปัจจุบันที่คุณอยู่ในตำแหน่ง ด้วยคำสั่ง find คุณสามารถใช้ wildcard และสวิตช์ต่าง ๆ เพื่อดูรายการตัวเลือกทั้งหมดพิมพ์
man find
หรือถ้าไม่มี man page ในระบบของคุณ
find --help
อย่างไรก็ตามมีเครื่องมือที่ทันสมัยกว่าและเร็วกว่าจากนั้นค้นหาซึ่งข้ามผ่านระบบไฟล์ทั้งหมดของคุณและจัดทำดัชนีไฟล์ของคุณเครื่องมือทั่วไปหนึ่งอย่างนั้นคือการค้นหาหรือจัดวาง / จัดสรร / mlocate คุณควรตรวจสอบคู่มือระบบปฏิบัติการของคุณว่าจะติดตั้งอย่างไร ติดตั้งแล้วจำเป็นต้องเริ่มต้นฐานข้อมูลหากสคริปต์การติดตั้งไม่ได้ทำให้คุณสามารถทำได้ด้วยตนเองโดยพิมพ์
sudo updatedb
และเพื่อใช้ในการค้นหาไฟล์บางประเภท
locate filename
หรือเพื่อค้นหาชื่อไฟล์หรือลายจากภายในไดเรกทอรีปัจจุบันคุณสามารถพิมพ์:
pwd | xargs -n 1 -I {} locate "filepattern"
มันจะตรวจสอบฐานข้อมูลของไฟล์และพิมพ์ชื่อพา ธ ที่ตรงกับรูปแบบที่คุณพิมพ์ได้อย่างรวดเร็ว หากต้องการดูรายการตัวเลือกการค้นหาทั้งหมดให้พิมพ์:
locate --helpหรือman locate
นอกจากนี้คุณสามารถกำหนดค่าการค้นหาเพื่ออัปเดตฐานข้อมูลตามเวลาที่กำหนดผ่านงาน cron ดังนั้นตัวอย่าง cron ที่อัปเดตฐานข้อมูลที่ 1AM จะมีลักษณะดังนี้:
0 1 * * * updatedb
งาน cron เหล่านี้จำเป็นต้องถูกกำหนดค่าโดยรูทเนื่องจาก updatedb ต้องการสิทธิ์รูทเพื่อสำรวจระบบไฟล์ทั้งหมด
สำหรับการค้นหาไฟล์
find / -xdev -name settings.xml -> คอมพิวเตอร์ทั้งหมด
find ./ -xdev -name settings.xml -> ไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย
สำหรับไฟล์ที่มีประเภทส่วนขยาย
find . -type f -name "*.iso"
ฉันประหลาดใจที่เห็นว่าการค้นหาไม่ได้ใช้อย่างมากเมื่อเราต้องไปซ้ำ
ฉันจะค้นหา "$ PWD" เป็นอันดับแรกเพื่อรับรายการไฟล์ในโฟลเดอร์ปัจจุบันที่น่าสนใจจากนั้นเรียกใช้ greps กับไฟล์เหล่านั้นตามที่ฉันต้องการ
locate "$PWD" | grep -P <pattern>
แน่นอนว่านี่คือการสันนิษฐานว่าการอัพเดต b เสร็จสิ้นแล้วและดัชนีจะได้รับการอัปเดตเป็นระยะ นี่เป็นวิธีที่เร็วกว่ามากในการค้นหาไฟล์มากกว่าเรียกใช้การค้นหาและขอให้ลงต้นไม้ กล่าวถึงนี้เพื่อความสมบูรณ์ ไม่มีสิ่งใดต่อต้านการใช้การค้นหาถ้าต้นไม้ไม่หนักมาก
locate "$PWD*.mp4" เพียงเพื่อเตือนว่าคุณอาจจะข้ามgrep
คำสั่งด้านล่างช่วยในการค้นหาไฟล์ใด ๆ
1) โดยไม่คำนึงถึงกรณีที่
2) ผลการยกเว้นโฟลเดอร์โดยไม่ได้รับอนุญาต
3) การค้นหาจากรากหรือจากเส้นทางที่คุณต้องการ เปลี่ยน / ด้วยพา ธ ที่คุณต้องการ
ไวยากรณ์:
find -iname '' 2> & 1 | grep -v "ไม่อนุญาต"
ตัวอย่าง
ค้นหา / - ชื่อ 'C * .xml' 2> & 1 | grep -v "การอนุญาตถูกปฏิเสธ"
find / -iname '*C*.xml' 2>&1 | grep -v "Permission denied"
find / -iname '*C*.xml' 2>/dev/null
หากคุณต้องการค้นหาไฟล์พิเศษด้วยไวด์การ์ดคุณสามารถใช้รหัสต่อไปนี้:
find . -type f -name "*.conf"
สมมติว่าคุณต้องการค้นหาไฟล์. config ทุกไฟล์จากที่นี่:
.หมายถึงการค้นหาที่เริ่มต้นจากที่นี่ (ตำแหน่งปัจจุบัน)
-typeหมายถึงประเภทของรายการค้นหาที่นี่คือไฟล์ (f)
-nameหมายความว่าคุณต้องการค้นหาไฟล์ที่มีชื่อ* .conf
นี้จะค้นหาไฟล์ที่เกี่ยวข้องทั้งหมดในไดเรกทอรีปัจจุบันและย่อยการคำนวณจำนวนบรรทัดของพวกเขาแยกต่างหากเช่นกัน:
find . -name "*.wanted" | xargs wc -l
ใช้
find path/to/dir -name "*.ext1" -o -name "*.ext2"
คำอธิบาย
findจะเรียกซ้ำ-o -orดังนั้นด้านบนหมายถึงการค้นหาไวด์การ์ดนี้หรืออันนี้ -oหากคุณมีเพียงรูปแบบหนึ่งแล้วไม่มีความจำเป็นในการ