Bash: ls * โดยไม่มีการจัดกลุ่มโฟลเดอร์


12

ถ้าฉันพิมพ์:

ls source/*

source/fonts:
fontello

source/images:
bg1.png                eng.png        fra.png   

ฉันได้รับรายชื่อไฟล์จัดกลุ่มตามชื่อโฟลเดอร์ ฉันจะรับรายชื่อไฟล์ได้อย่างไร

ls source/*

source/fonts/fontello
source/images/bg1.png
source/images/eng.png
source/images/fra.png   

ขอขอบคุณ


ถ้านี่เป็นสำหรับการใช้งานสคริปต์คุณอาจต้องการที่จะเห็นmywiki.wooledge.org/ParsingLs (ที่กล่าวว่ามีวิธีการใช้งานfindที่ไม่ถูกต้องเช่นกันโดยเฉพาะอย่างยิ่งถ้าคุณใช้for file in $(find ...)คุณได้ตีหนึ่งหนึ่งของพวกเขา)
ชาร์ลส์ดัฟฟี่

คำตอบ:


13

ดูเหมือนจะเป็นไปไม่ได้หากไม่มีการแก้ไขเอาต์พุต แต่นี่เป็นวิธีทางเลือกง่ายๆ:

find source/ -type f

หรือ (เฉพาะ GNU find find) เพื่อรับไฟล์ที่ระดับลึกในคำถามของคุณ:

find source/ -type f -mindepth 2 -maxdepth 2

(หรือถ้าคุณต้องการไดเรกทอรีเช่นlsให้คุณลบ-type f)


5

คุณสามารถติดกับ ls หากคุณเพิ่ม psychedlics ( ls -d):

# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*    
A/file  B/file  C/file

@Cululhu ตกลงตัวอย่างของฉันสั้นเกินไปถ้าคุณมีโฟลเดอร์ใน A, B a / o C -d ช่วยในการแสดงเฉพาะสิ่งที่คุณเลือก ฉันไม่ชอบการค้นหาและคุณสามารถกำหนดความลึกด้วยการโต้เถียงกับ ls -d
ikrabbe

ฉันแนะนำการแก้ไขคำตอบอื่น ๆ เพื่อจำกัดความลึก
o11c

@ o11c ดีมาก แต่ก็ยังfindเป็นสัตว์อ้วน
ikrabbe

3

คุณอาจสนใจ“ คนจน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 รู้จักตัวเลือกเชลล์ใด ๆ ) ในขณะที่ดูเหมือนว่าเป็นbashism โปรดระวัง - อาจไม่มีอยู่ใน bash ทุกรุ่น
  • หากfontsหรือimagesมีไดเรกทอรีย่อย**จะแสดงรายการทั้งหมดซ้ำไปเรื่อย ๆ วิธีหนึ่งในการจำกัดความลึกคือค่อนข้างแคบและไม่น่าเชื่อถือ

    ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
    

    ซึ่งจะลบบรรทัดที่มี/อักขระสามตัวขึ้นไป

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