วิธีใช้ _one_ shell globbing expression เพื่อแสดงรายการไฟล์ทั้งหมด (แน่นอนว่าไฟล์ที่ซ่อนอยู่ด้วย!)?


7

ตกลงคำถามนี้มีเป้าหมายที่เชลล์ Unix / Linux! ฉันต้องการเชลล์ expression globbing- (aka wildchard-) ที่ตรงกับไฟล์ทั้งหมดรวมถึงไฟล์ที่ซ่อนอยู่ในไดเรกทอรีปัจจุบันแบบไม่เรียกซ้ำ (maxdepth == 1) จนถึงตอนนี้ฉันต้องทำสองคำสั่งหรือใช้วิธีแก้ปัญหายาว (ดูด้านล่าง):

ls -lad *vim*
ls -lad .*vim*

ในขณะที่ใช้ zsh แต่ถ้าฉันจำได้ว่ามันเหมือนกันสำหรับเส้นประและทุบตีใช่มั้ย

วิธีแก้ปัญหาสั้น:

  • ls -la | grep vim
  • find . -maxdepth 1 | grep vim

แต่ฉันสงสัยหนึ่งร้อยครั้งไม่มีวิธีแก้ปัญหาแบบง่าย ๆ เกี่ยวกับเรื่องนี้และทำไม*ไม่ตรงกับตัวละครจุด?

คำตอบ:


11

* ไม่ตรงกับ.ตัวอักษร

มันไม่ตรงกัน.เมื่อมันเป็นตัวอักษรตัวแรกของชื่อ นี่เป็นกลไกที่เรียกว่า "dot file" สำหรับการ "ซ่อน" ไฟล์

ในzsh:

ตั้งค่าGLOB_DOTSตัวเลือกเปลือก นี่คือ§ 14.8 ของzshคู่มือผู้ใช้ โปรดทราบว่า.และ..จะถูกยกเว้นเสมอแม้ว่าตัวเลือกนี้จะเปิดอยู่

ในbash:

ตั้งค่าdotglobตัวเลือกเปลือก นี่คือใน§ 3.5.8 ของbashคู่มือผู้ใช้ โปรดทราบว่าการตั้งค่าGLOBIGNOREตัวแปรเปลือกโดยปริยายชุดdotglob; ที่bash(ไม่เหมือนzsh) จะไม่แยกโดยอัตโนมัติ.และ..เมื่อdotglobเปิดใช้งาน แต่bash จะทำเช่นนั้นเมื่อGLOBIGNOREมีการตั้งค่า ดังนั้นการตั้งค่าGLOBIGNORE=.จะมีผลกระทบของการเปิดdotglob และไม่รวมและ...

ใน GNU find:

อย่าทำอะไรเลย ตั้งแต่findutils4.2.2 เป็นต้นไปการวนซ้ำ-nameและการจับคู่ชื่อที่มีจุดเป็นอักขระตัวแรกอยู่แล้ว นี่คือใน§ 2.1.1 ของคู่มือผู้ใช้-iname findutils


3
ระมัดระวังกับสิ่งนี้! ใน Bash. * จะจับคู่ทุกอย่างรวมถึงหนึ่งไดเรกทอรีขึ้นไป
สิบโท Touchy

3

ใน bash ให้เปิดใช้งานตัวเลือกdotglob :

shopt -s dotglob

โดยค่าเริ่มต้นไฟล์ที่ซ่อนอยู่จะถูกซ่อนไว้เพื่อไม่ก่อให้เกิดความประหลาดใจและ annoyances - ตัวอย่างเช่นคุณเรียกใช้lsในไดเรกทอรีบ้านของคุณให้ดูไฟล์บางไฟล์จากเดือนที่ผ่านมาพยายามที่จะเอาพวกเขาด้วยrm *net*และไม่รู้ nuke .nethackrcเขียนอย่างระมัดระวัง


1
ใช่แน่นอนการเปิดใช้งานเป็นค่าเริ่มต้นไม่ใช่ความคิดที่ดี! แต่โชคดีที่ Zsh สามารถตั้งค่าและยกเลิกการตั้งค่าตัวเลือกผ่าน: setoptและunsetoptดังนั้นฉันจึงสามารถเปิดใช้งานได้เมื่อฉันต้องการมันบ่อยขึ้นและปิดการใช้งานในภายหลัง
คณิตศาสตร์

3

หากคุณไม่ต้องการเปลี่ยนตัวเลือกใด ๆ ตัวเลือกเหล่านี้จะทำ:

ls -ld {,.}*vim*
ls -ld *vim* .*vim*
find . -maxdepth 1 -name "*vim*"

ทำไมถึงมีเครื่องหมายจุลภาคคั่นระหว่างวงเล็บ? ที่ไม่*ยังไม่ตรงกับเครื่องหมายจุลภาคในด้านหน้าของชื่อไฟล์หรือไม่? อีกสองคนที่ฉันให้ไว้เพื่อแก้ไขปัญหา
คณิตศาสตร์

3
@ แม ธ : ในทุบตีคุณสามารถใช้สิ่งต่าง ๆ เช่น{a,b,c}xax bx cxดังนั้น{,.}*vim*ขยายสองอาร์กิวเมนต์*vim* .*vim*
grawity


1

เพื่อสร้างคำตอบของ @daniel kullman สิ่งนี้น่าจะสำเร็จในสิ่งที่คุณต้องการด้วย glob ที่เรียบง่ายพอสมควร

ค้นหาสตริง "blah" ซ้ำ ๆ ในไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันรวมถึงไฟล์ที่ซ่อนอยู่และไม่รวม ".. " ที่ทำให้โครงสร้างไดเรกทอรีหลักเป็นการค้นหา:

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