ฉันจะค้นหาไฟล์ทั้งหมดในปัจจุบันและโฟลเดอร์ย่อยซ้ำโดยอ้างอิงจากการจับคู่ไวด์การ์ดได้อย่างไร


1887

ฉันจะค้นหาไฟล์ทั้งหมดในปัจจุบันและโฟลเดอร์ย่อยซ้ำโดยอ้างอิงจากการจับคู่ไวด์การ์ดได้อย่างไร

คำตอบ:


2741

ใช้ค้นหาสิ่งต่อไปนี้:

find . -name "foo*"

findต้องการจุดเริ่มต้นและ.จุด (จุด) ไปยังไดเรกทอรีปัจจุบัน


21
ฉันรู้ว่าสิ่งนี้ถูกแท็กเป็น linux แต่นี่เป็นสิ่งที่ควรค่าแก่การกล่าวถึง: จำเป็นต้องใช้พา ธ สำหรับตัวแปร * อื่น ๆ ที่ไม่ใช่ linux บน linux พา ธ นั้นเป็นทางเลือกถ้าคุณต้องการใช้จุด
IslandCow

4
@Seatter "foo *" บอกให้ค้นหาเพื่อค้นหาไฟล์ทั้งหมดที่ขึ้นต้นด้วย "foo" มันเป็นเพียงตัวอย่างของเขา คุณสามารถใช้ "gpio *" เพื่อค้นหาไฟล์ทั้งหมดที่ชื่อขึ้นต้นด้วย gpio หรือเพียงแค่ "gpio1" เพื่อค้นหาไฟล์ทั้งหมดที่ชื่อ gpio1
schumacher574

29
โปรดทราบว่า "foo *" อยู่ในเครื่องหมายอัญประกาศดังนั้นเชลล์จะไม่ขยายออกก่อนที่จะส่งผ่านเพื่อค้นหา หากคุณเพิ่งทำfind . foo*สิ่งfoo*นั้นจะถูกขยายออกและจากนั้นก็ผ่านไปเพื่อค้นหา
grinch

32
คุ้มค่ากับความเครียดที่" "จำเป็นสำหรับการค้นหาแบบเรียกซ้ำ
WesternGun

3
มีประโยชน์เช่นกัน: หากคุณไม่ต้องการได้รับการแจ้งเตือนเกี่ยวกับไดเรกทอรีที่คุณไม่ได้รับอนุญาต (หรือข้อผิดพลาดอื่น ๆ ) คุณสามารถทำได้find . -name "foo*" 2>/dev/null
Jobbo

221

การหาท่อเข้าสู่ grep มักจะสะดวกกว่า มันให้พลังเต็มที่ของการแสดงออกปกติสำหรับการจับคู่ไวด์การ์ดโดยพลการ

ตัวอย่างเช่นหากต้องการค้นหาไฟล์ทั้งหมดที่มีสตริงที่ไม่สนใจขนาดตัวพิมพ์ "foo" ในชื่อไฟล์:

~$ find . -print | grep -i foo

57
findนอกจากนี้ยังมี-iname, -regexและ-iregexธงสัญลักษณ์แทนสำหรับกรณีตาย regex และกรณีตายจับคู่ regex ดังนั้นท่อจะgrepไม่จำเป็น
iobender

7
ฉันไม่คิดว่ามันเกี่ยวกับการไม่จำเป็น แต่ก็สะดวกกว่า
Elijah Lynn

1
อย่างไรก็ตามการไพพ์ไปยัง grep -v สามารถอนุญาตให้คุณใช้สตริงแบบง่ายหรือ regexes เพื่อลบรายการที่คุณไม่ต้องการ
door_number_three

3
@iobender - น่าเศร้าที่ฉันสามารถบอกคุณได้จากประสบการณ์ว่ามีบางระบบที่ไม่มีfindคำสั่งที่รองรับตัวเลือกเหล่านั้น บางครั้งgrepกลายเป็นตัวเลือกเท่านั้น
นาย Llama

150

find จะค้นหาไฟล์ทั้งหมดที่ตรงกับรูปแบบ:

find . -name "*foo"

อย่างไรก็ตามหากคุณต้องการรูปภาพ:

tree -P "*foo"

หวังว่านี่จะช่วยได้!


18
brew install treeสำหรับผู้ใช้ Mac OSX ที่ไม่มีการapt-getติดตั้ง
DeBraid

1
ทดสอบบน macOS Sierra เพียงเพิ่ม '--print' -> 'find ชื่อ "* foo" - พิมพ์ ' superuser.com/questions/177289/searching-mac-through-terminal
john-salib

2
sudo yum ติดตั้ง tree-y สำหรับ CentOS
Santosh Kumar Arjunan

39
find -L . -name "foo*"

ในบางกรณีฉันต้องการพารามิเตอร์ -L เพื่อจัดการลิงก์ไดเรกทอรีสัญลักษณ์ โดยลิงก์สัญลักษณ์เริ่มต้นจะถูกละเว้น ในกรณีเหล่านั้นค่อนข้างสับสนเพราะฉันจะเปลี่ยนไดเรกทอรีเป็นไดเรกทอรีย่อยและดูไฟล์ที่ตรงกับรูปแบบ แต่การค้นหาจะไม่ส่งคืนชื่อไฟล์ การใช้ -L แก้ปัญหานั้น ตัวเลือกลิงก์สัญลักษณ์สำหรับค้นหาคือ -P -L -H


1
สวิตช์ L มีประโยชน์มาก หลายครั้งที่ผู้ใช้ไม่มีความคิดเกี่ยวกับไดเรกทอรีพื้นฐานไม่ว่าจะเป็น softlinked หรือเป็นไดเรกทอรีปกติ ดังนั้นในกรณีที่มีข้อสงสัยมันดีเสมอที่จะใช้ตัวเลือก L อย่างน้อยมันช่วยฉันได้เสมอ
Ritesh

2
นั่นคือคำตอบสำหรับฉัน ขอบคุณ!
iedmrc

33

หากเชลล์ของคุณรองรับตัวเลือก globbing ใหม่ (สามารถเปิดใช้งานโดย:)shopt -s globstarคุณสามารถใช้:

echo **/*foo*

เพื่อค้นหาไฟล์หรือโฟลเดอร์ซ้ำ ๆ นี้รองรับโดย Bash 4, zsh และเชลล์ที่คล้ายกัน


โดยส่วนตัวแล้วฉันได้ฟังก์ชั่นเชลล์นี้มาแล้ว:

f() { find . -name "*$1*"; }

หมายเหตุ: บรรทัดด้านบนสามารถวางโดยตรงไปยังเชลล์หรือเพิ่มลงใน~/.bashrcไฟล์ของผู้ใช้ของคุณ

จากนั้นฉันสามารถค้นหาไฟล์ใด ๆ โดยพิมพ์:

f some_name

หรือคุณสามารถใช้fdยูทิลิตี้fd patternที่มีไวยากรณ์ง่ายเช่น


1
สิ่งนี้จะอยู่ในระดับเดียว ไม่ได้เรียกซ้ำไปยังไดเรกทอรีย่อยสำหรับฉัน
Broncha

3
@Broncha เพราะคุณต้องเปิดใช้งานการขยายแบบวงกลมโดยshopt -s globstarคำสั่ง สิ่งนี้ได้รับการสนับสนุนใน Bash, zsh และเชลล์ที่คล้ายกัน
kenorb

bash-3.2$ shopt -s globstarให้bash: shopt: globstar: invalid shell option name
drewish

@drewish คุณต้องอัพเกรด Bash เป็น 4.x
kenorb

echo * / * fooเร็วกว่าการค้นหา
Josef Klimuk

31

fd

ในกรณีที่findช้าเกินไปให้ลองใช้fdยูทิลิตี้ซึ่งเป็นทางเลือกที่ง่ายและรวดเร็วfindเขียนใน Rust

ไวยากรณ์:

fd PATTERN

การสาธิต:

หน้าแรก: https://github.com/sharkdp/fd


17
ครั้งแรกที่ฉันเห็น gif บน SO ในเกือบ 9 ปี งานที่ดี!
Joshua Pinter

1
ผลการดำเนินงานเหล่านั้นดูมีแนวโน้มมาก คุณอาจจะพิจารณาเพิ่ม fd ไปที่ home-brew ...
23345

หัวข้อ: คุณใช้เครื่องมือใดในการสร้างไฟล์ svg สำหรับการสาธิต
aprodan

2
@aprodan ภาพตัวอย่างถูกคัดลอกมาจาก GitHub แต่ฉันเชื่อว่าพวกเขากำลังใช้อยู่asciinemaจากนั้นแปลงเป็นรูปแบบ GIF แต่ฉันไม่แน่ใจ
kenorb

1
จริงๆแล้วมันเป็นรูปแบบ SVG ดังนั้นอาจasciicast2vectorใช้งานได้
kenorb

27
find <directory_path>  -type f -name "<wildcard-match>"

ใน wildcard-match คุณสามารถระบุสตริงที่คุณต้องการจับคู่เช่น * .c (สำหรับไฟล์ c ทั้งหมด)


1
คำตอบของคุณถูกต้องเป็นอันดับแรกที่นี่เพราะจะค้นหาเฉพาะไฟล์ตามที่ระบุ ประเภทอื่นที่ไม่ได้ระบุประเภทจะส่งคืนไดเรกทอรี
wilsotc

หากคุณต้องการค้นหาไดเรกทอรี "-type f" สามารถเปลี่ยนเป็น "-type d"
XYZ_Linux

11

คุณสามารถใช้ได้:

# find . -type f  -name 'text_for_search'

หากคุณต้องการใช้การใช้ REGX -iname

# find . -type f  -iname 'text_for_search'

9

คำสั่งดังต่อไปนี้จะแสดงรายการไฟล์ทั้งหมดที่มีชื่อ "รูปแบบ" ที่แน่นอน (ตัวอย่าง) ในปัจจุบันและโฟลเดอร์ย่อย

find ./ -name "pattern"


8

วิธีเริ่มต้นในการค้นหาไฟล์วนซ้ำและส่วนใหญ่จะมีให้ใช้งาน

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 ต้องการสิทธิ์รูทเพื่อสำรวจระบบไฟล์ทั้งหมด


7

สำหรับการค้นหาไฟล์
find / -xdev -name settings.xml -> คอมพิวเตอร์ทั้งหมด
find ./ -xdev -name settings.xml -> ไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย

สำหรับไฟล์ที่มีประเภทส่วนขยาย

find . -type f -name "*.iso"

6

ฉันประหลาดใจที่เห็นว่าการค้นหาไม่ได้ใช้อย่างมากเมื่อเราต้องไปซ้ำ

ฉันจะค้นหา "$ PWD" เป็นอันดับแรกเพื่อรับรายการไฟล์ในโฟลเดอร์ปัจจุบันที่น่าสนใจจากนั้นเรียกใช้ greps กับไฟล์เหล่านั้นตามที่ฉันต้องการ

locate "$PWD" | grep -P <pattern>

แน่นอนว่านี่คือการสันนิษฐานว่าการอัพเดต b เสร็จสิ้นแล้วและดัชนีจะได้รับการอัปเดตเป็นระยะ นี่เป็นวิธีที่เร็วกว่ามากในการค้นหาไฟล์มากกว่าเรียกใช้การค้นหาและขอให้ลงต้นไม้ กล่าวถึงนี้เพื่อความสมบูรณ์ ไม่มีสิ่งใดต่อต้านการใช้การค้นหาถ้าต้นไม้ไม่หนักมาก


locate "$PWD*.mp4" เพียงเพื่อเตือนว่าคุณอาจจะข้ามgrep
ถ้ำ Jefferey

5

คำสั่งด้านล่างช่วยในการค้นหาไฟล์ใด ๆ

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"

1
ทำไมคุณถึงใช้ grep บนโลกนี้? เพียงเปลี่ยนเส้นทาง stderr ไปเป็นโมฆะfind / -iname '*C*.xml' 2>/dev/null
phuclv

3

หากคุณต้องการค้นหาไฟล์พิเศษด้วยไวด์การ์ดคุณสามารถใช้รหัสต่อไปนี้:

find . -type f -name "*.conf"

สมมติว่าคุณต้องการค้นหาไฟล์. config ทุกไฟล์จากที่นี่:

.หมายถึงการค้นหาที่เริ่มต้นจากที่นี่ (ตำแหน่งปัจจุบัน)
-typeหมายถึงประเภทของรายการค้นหาที่นี่คือไฟล์ (f)
-nameหมายความว่าคุณต้องการค้นหาไฟล์ที่มีชื่อ* .conf


3

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

find . -name "*.wanted" | xargs wc -l

2

ใช้

find path/to/dir -name "*.ext1" -o -name "*.ext2"

คำอธิบาย

  1. พารามิเตอร์แรกคือไดเรกทอรีที่คุณต้องการค้นหา
  2. โดยค่าเริ่มต้นfindจะเรียกซ้ำ
  3. ยืน-o -orดังนั้นด้านบนหมายถึงการค้นหาไวด์การ์ดนี้หรืออันนี้ -oหากคุณมีเพียงรูปแบบหนึ่งแล้วไม่มีความจำเป็นในการ
  4. จำเป็นต้องใช้เครื่องหมายคำพูดล้อมรอบลวดลายตัวแทน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.