วิธีค้นหาไฟล์ทั้งหมดที่ขึ้นต้นด้วยชื่อ“ ABC” ในไดเรกทอรีได้อย่างไร?


58

ฉันต้องการค้นหาไฟล์ที่เริ่มต้นด้วยชื่อเฉพาะ อาจมีหลายไฟล์เริ่มต้นด้วยรูปแบบเฉพาะและฉันต้องการรายการไฟล์ดังกล่าวทั้งหมดที่มีอยู่ในไดเรกทอรี

คำตอบ:


60

หากต้องการคำตอบที่มีอยู่ให้สมบูรณ์:

ls

ยูทิลิตี้รายการไดเรกทอรีเริ่มต้นlsสามารถใช้ร่วมกับสัญลักษณ์ตัวแทนของเชลล์ วิธีค้นหาไฟล์ทั้งหมดที่มีลวดลายabc:

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

โปรดทราบว่านามสกุลไฟล์นั้นเกี่ยวข้องกับผลการค้นหาด้วย


tree

ในกรณีที่เราต้องการแสดงรายการไฟล์ในแผนผังไดเรกทอรีเราสามารถออกtreeค้นหารูปแบบที่กำหนดเช่น:

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

ในกรณีนี้treeรองรับสัญลักษณ์แทน


2
ทำไมเมื่อฉันทำls -l B*มันแสดงเนื้อหาของไดเรกทอรีทั้งหมดที่เริ่มต้นด้วยBแทนที่จะเป็นเพียงแค่ชื่อของไดเรกทอรีที่ตรงกัน?
ErikE

@ErikE เพราะเมื่อคุณถามไปยังรายการไดเรกทอรีจะเปิดมันก็เป็นเช่นเดียวกับการทำls คุณสามารถปราบปรามพฤติกรรมที่มีls -l BirthdayPhotos ls -d B*
Azor Ahai

@ AzorAhai แต่ทำไมมันถึงถือว่าB*เป็นข้อกำหนดไดเรกทอรี?
ErikE

@ErikE เนื่องจากการใช้ไฟล์ glob B*จะขยายเพื่อจับคู่ไดเรกทอรีทั้งหมดที่ขึ้นต้นด้วยBดังนั้นคุณจึงผ่านlsรายการไดเรกทอรีจริง ๆ ดังนั้นจึงเปิดไดเรกทอรีทั้งหมดให้คุณ
Azor Ahai

1
ไม่ตอบคำถาม ls -d ABC*เป็นสิ่งที่ผู้เขียนถามเกี่ยวกับ นอกจากนี้ความคิดเห็นในข้อมูลโค้ดไม่ถูกต้องls abc*แสดงรายการเนื้อหาของไดเรกทอรีที่ขึ้นต้นด้วย abc
greatvovan

42

คุณสามารถใช้findคำสั่งเพื่อค้นหาไฟล์ด้วยรูปแบบ

find . -type f -name "abc*" 

คำสั่งดังกล่าวจะค้นหาไฟล์ที่ขึ้นต้นด้วย abc ภายใต้ไดเรกทอรีการทำงานปัจจุบัน

-name 'abc'จะแสดงรายการไฟล์ที่ตรงทั้งหมด เช่น abc

คุณยังสามารถใช้

 -iname
 -regex 

ตัวเลือกพร้อมfindคำสั่งเพื่อค้นหาชื่อไฟล์โดยใช้รูปแบบ


7

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

find | grep '^\./ABC'

... และแทนที่ABCด้วยข้อความของคุณ

เพื่อให้เข้าใจคำสั่งเราจะแบ่งมันออกเล็กน้อย:

  • findแสดงรายการไฟล์ทั้งหมดภายใต้ไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย การใช้เพียงอย่างเดียวจะแสดงรายการทุกอย่างที่นั่น โปรดทราบว่าfindส่งออกแต่ละไฟล์หรือไดเรกทอรีเริ่มต้นด้วยการ./ระบุว่าเส้นทางของพวกเขาจะสัมพันธ์กับไดเรกทอรีปัจจุบัน การตระหนักถึงนี้เป็นสิ่งสำคัญเพราะมันหมายความว่าเราจะค้นหาเพื่อให้ได้ผลลัพธ์ที่เริ่มต้นด้วยและไม่เพียง./ABCABC

  • ตัวละครท่อ|เปลี่ยนเส้นทางผลลัพธ์ของคำสั่งหนึ่งไปยังอีกในกรณีนี้การส่งออกของถูกเปลี่ยนเส้นทางไปfind grepสิ่งนี้เรียกว่าท่อ

  • grep^\./ABCใช้เวลาการส่งออกและตัวกรองโดยใช้รูปแบบที่กำหนด

    • ขอให้สังเกตว่ารูปแบบที่ยกมาด้วยคำพูดเดียว' 'เพื่อป้องกันเปลือกจากการตีความตัวอักษรพิเศษที่อยู่ภายใน
  • ตอนนี้รูปแบบตัวเองถูกเขียนในไวยากรณ์เฉพาะที่เรียกว่าการแสดงออกปกติหรือregexสั้น ๆ Regex เป็นเครื่องมือค้นหาที่ทรงพลังอย่างยิ่งหากคุณเชี่ยวชาญและมีเว็บไซต์เช่นนี้ที่สอนคุณในเชิงลึกยิ่งขึ้น แต่โปรดทราบว่าgrepไม่ใช่เครื่องมือ Regex ที่มีคุณสมบัติครบถ้วนและคุณไม่สามารถทำทุกอย่างได้

  • เพื่อจุดประสงค์ของเรา:

    • ^ใน regex ตรงกับจุดเริ่มต้นของสตริง; สิ่งนี้จะป้องกันไม่ให้จับคู่รูปแบบหากไม่เกิดขึ้นในตอนต้นของชื่อไฟล์

    • .ใน regex มีความหมายพิเศษด้วยเช่นกันมันหมายถึง "จับคู่อักขระเดี่ยวใด ๆ ที่นี่" ในกรณีที่คุณต้องการใช้เป็นจุดตัวอักษรคุณจะต้อง "หลบหนี" โดยใช้เครื่องหมายแบ็กสแลช\ก่อน (ใช่การจับคู่อักขระใด ๆ จะไม่เป็นอันตรายในกรณีของเรา แต่ฉันทำเพื่อความสมบูรณ์แบบ)


1
คุณจะทำไมfind | grepเมื่อfindมีความสามารถในรูปแบบการจับคู่ที่ดีอย่างสมบูรณ์ของตัวเอง?
Darael

3

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

tree | grep ABC

2

คุณสามารถค้นหารูปแบบเฉพาะได้โดยใช้โปรแกรมจัดการไฟล์ Nautilus และนิพจน์ทั่วไป

โดยคลิกที่เลือกการจับคู่รายการในเมนูรูปเฟืองด้านล่าง (คุณสามารถกดCtrl+ s)

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นให้พิมพ์นิพจน์ปกติ ABC*และตรวจสอบความถูกต้อง

ป้อนคำอธิบายรูปภาพที่นี่

ทุกไฟล์ที่มีชื่อตรงกับรูปแบบของคุณจะถูกเลือกโดยอัตโนมัติ

ป้อนคำอธิบายรูปภาพที่นี่

ฉันใช้ Nautilus 3.6. * จากGNOME3 PPA บน Ubuntu 12.10 (ปริมาณ)


1

ทางออกที่ง่ายที่สุดสำหรับฉัน

ls | grep PATTERN

ที่นี่คุณสามารถให้การแสดงออกปกติในรูปแบบ

ตัวอย่างเช่นหากต้องการค้นหาไฟล์ที่มี "ab" ที่ใดก็ได้ภายในชื่อให้พิมพ์

ls | grep ".*ab.*"

ในการค้นหาไฟล์ที่ขึ้นต้นด้วย "ab" ให้พิมพ์

ls | grep "^ab"

1

หากคุณไม่ทราบว่าABC*ไฟล์อยู่ในไดเรกทอรีใดและคุณมีไฟล์หลายล้านไฟล์locateคำสั่งคือวิธีที่เร็วที่สุด

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

หมายเหตุ:

  • คำสั่งดังกล่าวใช้เวลา 1 วินาทีในการทำงานกับ 1 ล้านไฟล์
  • ในการเปรียบเทียบfindคำสั่งเริ่มต้นที่/ไดเรกทอรีรากจะใช้เวลานานและสร้างข้อผิดพลาดในการอนุญาตจำนวนมาก
  • หากไฟล์ถูกสร้างขึ้นวันนี้คุณต้องเรียกใช้sudo updatedbก่อน

0

ฉันใช้

ls | grep abc

หรือ

ls -la | grep abc

มันแสดงไฟล์ทั้งหมดด้วย abc ไม่ใช่แค่เริ่มต้นด้วย abc แต่มันเป็นวิธีที่ง่ายสำหรับฉันที่จะทำเช่นนี้


0

งูหลาม:

$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'

Perl:

$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name  },".")' 

0
printf "%s" /path/to/files/ABC*

นี่คือการจับคู่รูปแบบกลมที่ยึดทั้งสองด้าน สิ่งนี้จะตรงกับไฟล์ทั้งหมดที่เริ่มต้นด้วย "ABC" เช่น "ABC", "ABC.txt", "ABC123" แต่ไม่ใช่ "xABC" จากบรรทัดคำสั่งโดยใช้ 'ls' แทน 'printf' ที่นี่เป็นทางเลือกที่ปลอดภัยอย่างไรก็ตามขึ้นอยู่กับความเห็นของผู้ที่คุณเห็นด้วยว่า 'ls' ไม่ปลอดภัยสำหรับการใช้งานในสคริปต์ ในกรณีนั้นการใช้ 'printf' กับการจับคู่รูปแบบกลมถือว่าปลอดภัย หากคุณจะใช้สิ่งนี้ในสคริปต์เอาต์พุตของ 'printf' จะไม่มีอักขระบรรทัดใหม่จนกว่าจะสิ้นสุดการสตรีมเอาต์พุตเช่น:

printf "%s" /path/to/files/ABC*  

ผลตอบแทน:

/path/to/files/ABC /path/to/files/ABC123

หากคุณต้องการตัวแบ่งบรรทัดหลังจากแต่ละอินสแตนซ์:

printf "%s\n" /path/to/files/ABC*

ผลตอบแทน:

/path/to/files/ABC 

/path/to/files/ABC123

"/ path / to / files /" ยังคงอยู่ในเอาต์พุตหากคุณป้อนด้วยวิธีนั้นเมื่อคุณรันคำสั่ง 'printf' หากไม่มีชื่อไฟล์ก็จะปรากฏขึ้น:

printf "%s" ABC* 

ผลตอบแทน

ABC ABC123

สมมติว่าคุณเรียกใช้คำสั่งภายในไดเรกทอรีที่มีไฟล์อยู่


echo /path/to/files/ABC* | tr " " "\n"ไม่ได้เป็นความคิดที่ดี พิจารณาว่ามีไฟล์/path/to/files/ABC EFGหรือไม่มีช่องว่างในชื่อไฟล์ คุณtrจะแบ่งชื่อไฟล์ออกเป็นสองบรรทัดแยกกันซึ่งไม่ดี ยิ่งแย่ไปกว่านั้นถ้ามีชื่อไฟล์หลายช่อง ฉันขอแนะนำให้คุณใช้printf "%s\n" ABC*แทนซึ่งจะช่วยให้มีช่องว่างในชื่อไฟล์ แต่ก็ยังเป็นปัญหากับตัวละครพิเศษอื่น ๆ เช่น\n
Sergiy Kolodyazhnyy

0

Command-tในหนึ่งในปลั๊กอิน vim ที่ชื่นชอบมันเป็นปลั๊กอินที่ใช้ทับทิมด้านบนทำงานร่วมกับFZF

ด้วยการใช้ Comamnd-T และ FZF คุณสามารถทำการค้นหาด้วยกลไก "fuzzy" ที่เร็วมากสำหรับ:

  • การเปิดไฟล์และบัฟเฟอร์
  • ข้ามไปที่แท็กและช่วย
  • การรันคำสั่งหรือการค้นหาและคำสั่งก่อนหน้า
  • ด้วยการกดแป้นจำนวนน้อยที่สุด

อย่างที่เห็น

ป้อนคำอธิบายรูปภาพที่นี่

ฉันค้นหาประวัติคำสั่งเสมอโดยเปิดเทอร์มินัลใหม่แล้วกด:

CTRL+R

นอกเหนือจากการค้นหาในโฟลเดอร์ทั้งหมดซ้ำโดยเขียนในแท็บเทอร์มินัล:

fzf

จากนั้นเริ่มชื่อไฟล์ของคุณ

ABC

นอกจากนี้คุณสามารถเขียนภายใน vim

:CommandT 

มีประโยชน์จริง ๆ โดยเฉพาะในโฟลเดอร์ขนาดใหญ่


0

สมมติว่าฉันอยู่ที่ไดเรกทอรีรากและฉันต้องการรายการไดเรกทอรี ฯลฯ เท่านั้น: เราเขียน

find -type d -name "etc"

ผลลัพธ์ที่เราได้รับ

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

ตัวอย่างอื่น,

นอกจากนี้เราสามารถเขียน:

ls | grep "etc"

เราได้รับ,

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