คุณอาจสนใจ“ คนจนfind
”:
shopt -s globstar
shopt -s
sระบุตัวเลือกเชลล์ที่ระบุชื่อ globstar
ตัวเลือกที่ถูกกำหนดไว้ดังต่อไปนี้ในการทุบตี (1) :
หากตั้งค่ารูปแบบที่**
ใช้ในบริบทการขยายชื่อไฟล์ / ชื่อพา ธ จะจับคู่กับไฟล์[sic]และไดเรกทอรีหรือไดเรกทอรีย่อยหรือมากกว่า หากรูปแบบตามด้วย a /
เฉพาะไดเรกทอรีและไดเรกทอรีย่อยจะจับคู่
ดังนั้นหลังจากที่คุณทำเสร็จแล้วshopt -s globstar
คำสั่งใด ๆ ต่อไปนี้:
ls -d1 - source / ** # ตัวอักษรหลัง 'd' คือตัวเลขตัวหนึ่ง
ls -d - source / ** | cat # ie มันจะเขียนลงในไพพ์ไปยังคำสั่งใด ๆ
printf "% s \ n" แหล่งที่มา / **
จะผลิตผลลัพธ์:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
น่าเสียดายที่นี่รวมถึงชื่อไดเรกทอรีด้วย มันอาจช่วยให้คุณเล็ก ๆ น้อย ๆที่จะรู้ว่า
printf "%s\n" source/**/
จะผลิตผลลัพธ์:
source/
source/fonts
source/images
คือเพียงชื่อไดเรกทอรี คุณอาจจะเปลี่ยนเส้นทางออกของหนึ่งในชุดแรกของคำสั่งไปหนึ่งแฟ้มเปลี่ยนเส้นทางการส่งออกของดังกล่าวข้างต้นไปยังแฟ้มที่สองแล้วใช้comm
, diff
หรือสิ่งที่คล้ายกันในการลบไฟล์ที่สองจากครั้งแรกเหลือเพียงธรรมดา ไฟล์ (ไม่ใช่ไดเร็กทอรี) แต่อย่าทำอย่างนั้น
วิธีการอื่น (ที่ไม่ค่อยดี) คือ
ls -d --file-type -- source/** | grep -v '/$'
--file-type
ตัวเลือกที่บอกls
จะแสดง/
ในตอนท้ายของชื่อแต่ละไดเรกทอรี (และตัวละครอื่น ๆ ที่ปลายของอื่น ๆ (พิเศษ) ประเภทไฟล์) เช่นนี้:
แหล่งที่มา // # เพิ่มพิเศษหนึ่ง
แหล่งที่มา / แบบอักษร / # เพิ่มอย่างใดอย่างหนึ่ง
แหล่งที่มา / fonts / fontello
แหล่งที่มา / ภาพ / # เพิ่มหนึ่ง
แหล่งที่มา / images / bg1.png
แหล่งที่มา / images / eng.png
แหล่งที่มา / images / fra.png
แล้วgrep -v '/$'
เอาบรรทัดที่ลงท้ายด้วย/
; เช่นชื่อไดเรกทอรี แต่น่าเสียดายที่--file-type
ตัวเลือกที่ไม่ได้ระบุไว้โดย POSIX ถ้ารุ่นของคุณไม่สนับสนุนการใช้งานls
-F
ที่เป็นเช่น--file-type
นั้นนอกจากจะแสดง*
ที่ส่วนท้ายของชื่อไฟล์เรียกใช้ซึ่งบางคนพบว่าน่ารำคาญ คุณสามารถกำจัดพวกเขาด้วยsed
:
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
หากคุณต้องการทำบางสิ่งกับไฟล์ทั้งหมด (และเฉพาะไฟล์) คุณสามารถทำได้
สำหรับ f ในแหล่งที่มา / **
ทำ
ถ้า [-f "$ f"]
แล้วก็
แทรกคำสั่งที่จะใช้กับไฟล์ธรรมดาที่นี่
Fi
เสร็จแล้ว
หมายเหตุ:
- เมื่อ
ls
ส่งออกไปยังเทอร์มินัลและไม่อยู่ในโหมด-l
( l ong) จะเขียนชื่อหลายชื่อต่อบรรทัด (เว้นแต่ชื่อจะยาวมาก) คุณสามารถบังคับให้เขียนชื่อหนึ่งชื่อต่อบรรทัดโดยการระบุ-1
(หนึ่ง) หรือโดยการเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์หรือไพพ์
- คุณอาจไม่จำเป็นต้องใช้คำสั่ง
--
ในls
คำสั่งเนื่องจากคุณกำลังแสดงรายการไดเรกทอรีที่มีเนื้อหาที่คุณสร้างขึ้น คุณควรใช้มันเมื่อรายชื่อในสมุดที่ไม่รู้จักป้องกันชื่อไฟล์ที่ขึ้นต้นด้วย*
-
ls
อย่าพยายามที่จะแยกเอาท์พุทจาก
globstar
ตัวเลือกเปลือกจะปรากฏขึ้นไม่ถูกกำหนดโดย POSIX (อันที่จริงแล้วฉันไม่แน่ใจว่า POSIX รู้จักตัวเลือกเชลล์ใด ๆ ) ในขณะที่ดูเหมือนว่าเป็นbash
ism โปรดระวัง - อาจไม่มีอยู่ใน bash ทุกรุ่น
หากfonts
หรือimages
มีไดเรกทอรีย่อย**
จะแสดงรายการทั้งหมดซ้ำไปเรื่อย ๆ วิธีหนึ่งในการจำกัดความลึกคือค่อนข้างแคบและไม่น่าเชื่อถือ
ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
ซึ่งจะลบบรรทัดที่มี/
อักขระสามตัวขึ้นไป
find
ที่ไม่ถูกต้องเช่นกันโดยเฉพาะอย่างยิ่งถ้าคุณใช้for file in $(find ...)
คุณได้ตีหนึ่งหนึ่งของพวกเขา)