ฉันต้องการค้นหาไฟล์ที่เริ่มต้นด้วยชื่อเฉพาะ อาจมีหลายไฟล์เริ่มต้นด้วยรูปแบบเฉพาะและฉันต้องการรายการไฟล์ดังกล่าวทั้งหมดที่มีอยู่ในไดเรกทอรี
ฉันต้องการค้นหาไฟล์ที่เริ่มต้นด้วยชื่อเฉพาะ อาจมีหลายไฟล์เริ่มต้นด้วยรูปแบบเฉพาะและฉันต้องการรายการไฟล์ดังกล่าวทั้งหมดที่มีอยู่ในไดเรกทอรี
คำตอบ:
หากต้องการคำตอบที่มีอยู่ให้สมบูรณ์:
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
รองรับสัญลักษณ์แทน
ls
คุณสามารถปราบปรามพฤติกรรมที่มีls -l BirthdayPhotos
ls -d B*
B*
เป็นข้อกำหนดไดเรกทอรี?
B*
จะขยายเพื่อจับคู่ไดเรกทอรีทั้งหมดที่ขึ้นต้นด้วยB
ดังนั้นคุณจึงผ่านls
รายการไดเรกทอรีจริง ๆ ดังนั้นจึงเปิดไดเรกทอรีทั้งหมดให้คุณ
ls -d ABC*
เป็นสิ่งที่ผู้เขียนถามเกี่ยวกับ นอกจากนี้ความคิดเห็นในข้อมูลโค้ดไม่ถูกต้องls abc*
แสดงรายการเนื้อหาของไดเรกทอรีที่ขึ้นต้นด้วย abc
คุณสามารถใช้find
คำสั่งเพื่อค้นหาไฟล์ด้วยรูปแบบ
find . -type f -name "abc*"
คำสั่งดังกล่าวจะค้นหาไฟล์ที่ขึ้นต้นด้วย abc ภายใต้ไดเรกทอรีการทำงานปัจจุบัน
-name 'abc'
จะแสดงรายการไฟล์ที่ตรงทั้งหมด เช่น abc
คุณยังสามารถใช้
-iname
-regex
ตัวเลือกพร้อมfind
คำสั่งเพื่อค้นหาชื่อไฟล์โดยใช้รูปแบบ
มีหลายวิธีขึ้นอยู่กับสิ่งที่คุณต้องการจะทำกับพวกเขา โดยทั่วไปหากคุณต้องการเพียงแค่แสดงรายการคุณสามารถทำได้ในเทอร์มินัลโดยใช้:
find | grep '^\./ABC'
... และแทนที่ABC
ด้วยข้อความของคุณ
เพื่อให้เข้าใจคำสั่งเราจะแบ่งมันออกเล็กน้อย:
find
แสดงรายการไฟล์ทั้งหมดภายใต้ไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย การใช้เพียงอย่างเดียวจะแสดงรายการทุกอย่างที่นั่น โปรดทราบว่าfind
ส่งออกแต่ละไฟล์หรือไดเรกทอรีเริ่มต้นด้วยการ./
ระบุว่าเส้นทางของพวกเขาจะสัมพันธ์กับไดเรกทอรีปัจจุบัน การตระหนักถึงนี้เป็นสิ่งสำคัญเพราะมันหมายความว่าเราจะค้นหาเพื่อให้ได้ผลลัพธ์ที่เริ่มต้นด้วยและไม่เพียง./ABC
ABC
ตัวละครท่อ|
เปลี่ยนเส้นทางผลลัพธ์ของคำสั่งหนึ่งไปยังอีกในกรณีนี้การส่งออกของถูกเปลี่ยนเส้นทางไปfind
grep
สิ่งนี้เรียกว่าท่อ
grep
^\./ABC
ใช้เวลาการส่งออกและตัวกรองโดยใช้รูปแบบที่กำหนด
' '
เพื่อป้องกันเปลือกจากการตีความตัวอักษรพิเศษที่อยู่ภายในตอนนี้รูปแบบตัวเองถูกเขียนในไวยากรณ์เฉพาะที่เรียกว่าการแสดงออกปกติหรือregexสั้น ๆ Regex เป็นเครื่องมือค้นหาที่ทรงพลังอย่างยิ่งหากคุณเชี่ยวชาญและมีเว็บไซต์เช่นนี้ที่สอนคุณในเชิงลึกยิ่งขึ้น แต่โปรดทราบว่าgrep
ไม่ใช่เครื่องมือ Regex ที่มีคุณสมบัติครบถ้วนและคุณไม่สามารถทำทุกอย่างได้
เพื่อจุดประสงค์ของเรา:
^
ใน regex ตรงกับจุดเริ่มต้นของสตริง; สิ่งนี้จะป้องกันไม่ให้จับคู่รูปแบบหากไม่เกิดขึ้นในตอนต้นของชื่อไฟล์
.
ใน regex มีความหมายพิเศษด้วยเช่นกันมันหมายถึง "จับคู่อักขระเดี่ยวใด ๆ ที่นี่" ในกรณีที่คุณต้องการใช้เป็นจุดตัวอักษรคุณจะต้อง "หลบหนี" โดยใช้เครื่องหมายแบ็กสแลช\
ก่อน (ใช่การจับคู่อักขระใด ๆ จะไม่เป็นอันตรายในกรณีของเรา แต่ฉันทำเพื่อความสมบูรณ์แบบ)
find | grep
เมื่อfind
มีความสามารถในรูปแบบการจับคู่ที่ดีอย่างสมบูรณ์ของตัวเอง?
คุณสามารถใช้ GREP ได้ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดและอาจเพิ่มพารามิเตอร์ grep อื่น ๆ เพื่อทำให้การจับคู่แม่นยำยิ่งขึ้น
tree | grep ABC
คุณสามารถค้นหารูปแบบเฉพาะได้โดยใช้โปรแกรมจัดการไฟล์ Nautilus และนิพจน์ทั่วไป
โดยคลิกที่เลือกการจับคู่รายการในเมนูรูปเฟืองด้านล่าง (คุณสามารถกดCtrl+ s)
จากนั้นให้พิมพ์นิพจน์ปกติ ABC*
และตรวจสอบความถูกต้อง
ทุกไฟล์ที่มีชื่อตรงกับรูปแบบของคุณจะถูกเลือกโดยอัตโนมัติ
ฉันใช้ Nautilus 3.6. * จากGNOME3 PPA บน Ubuntu 12.10 (ปริมาณ)
ทางออกที่ง่ายที่สุดสำหรับฉัน
ls | grep PATTERN
ที่นี่คุณสามารถให้การแสดงออกปกติในรูปแบบ
ตัวอย่างเช่นหากต้องการค้นหาไฟล์ที่มี "ab" ที่ใดก็ได้ภายในชื่อให้พิมพ์
ls | grep ".*ab.*"
ในการค้นหาไฟล์ที่ขึ้นต้นด้วย "ab" ให้พิมพ์
ls | grep "^ab"
หากคุณไม่ทราบว่า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
หมายเหตุ:
find
คำสั่งเริ่มต้นที่/
ไดเรกทอรีรากจะใช้เวลานานและสร้างข้อผิดพลาดในการอนุญาตจำนวนมากsudo updatedb
ก่อนฉันใช้
ls | grep abc
หรือ
ls -la | grep abc
มันแสดงไฟล์ทั้งหมดด้วย abc ไม่ใช่แค่เริ่มต้นด้วย abc แต่มันเป็นวิธีที่ง่ายสำหรับฉันที่จะทำเช่นนี้
งูหลาม:
$ 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 },".")'
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
Command-tในหนึ่งในปลั๊กอิน vim ที่ชื่นชอบมันเป็นปลั๊กอินที่ใช้ทับทิมด้านบนทำงานร่วมกับFZF
ด้วยการใช้ Comamnd-T และ FZF คุณสามารถทำการค้นหาด้วยกลไก "fuzzy" ที่เร็วมากสำหรับ:
อย่างที่เห็น
ฉันค้นหาประวัติคำสั่งเสมอโดยเปิดเทอร์มินัลใหม่แล้วกด:
CTRL+R
นอกเหนือจากการค้นหาในโฟลเดอร์ทั้งหมดซ้ำโดยเขียนในแท็บเทอร์มินัล:
fzf
จากนั้นเริ่มชื่อไฟล์ของคุณ
ABC
นอกจากนี้คุณสามารถเขียนภายใน vim
:CommandT
มีประโยชน์จริง ๆ โดยเฉพาะในโฟลเดอร์ขนาดใหญ่
สมมติว่าฉันอยู่ที่ไดเรกทอรีรากและฉันต้องการรายการไดเรกทอรี ฯลฯ เท่านั้น: เราเขียน
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
ls -l B*
มันแสดงเนื้อหาของไดเรกทอรีทั้งหมดที่เริ่มต้นด้วยB
แทนที่จะเป็นเพียงแค่ชื่อของไดเรกทอรีที่ตรงกัน?