ฉันจะค้นหาไฟล์ทั้งหมดในปัจจุบันและโฟลเดอร์ย่อยซ้ำโดยอ้างอิงจากการจับคู่ไวด์การ์ดได้อย่างไร
ฉันจะค้นหาไฟล์ทั้งหมดในปัจจุบันและโฟลเดอร์ย่อยซ้ำโดยอ้างอิงจากการจับคู่ไวด์การ์ดได้อย่างไร
คำตอบ:
ใช้ค้นหาสิ่งต่อไปนี้:
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
หากคุณมีเพียงรูปแบบหนึ่งแล้วไม่มีความจำเป็นในการ