มีตัวเลือกใด ๆ ที่มีคำสั่ง 'ls' ที่ฉันเห็นเฉพาะไดเรกทอรีหรือไม่?


74

บางครั้งฉันต้องตรวจสอบเฉพาะไดเรกทอรีไม่ใช่ไฟล์ มีตัวเลือกใด ๆ กับคำสั่ง ls หรือไม่? หรือมีประโยชน์สำหรับการทำเช่นนั้น?

แก้ไข : ฉันใช้ Mac OS X และls -dให้ฉัน.แม้ว่าฉันจะมีไดเรกทอรี


4
ใครสามารถอธิบายได้ว่าทำไมการls -dให้เท่านั้น.และทำไม*/ต้องเพิ่มจนถึงจุดสิ้นสุดเพื่อให้ทำงานได้
cwd

3
@cwd ถ้าคุณไม่ได้ระบุไฟล์ใด ๆเริ่มต้นที่ls .และ-dหมายความว่าอย่าพิมพ์เนื้อหาของไดเรกทอรีพิมพ์ไดเรกทอรีเอง
มิเคล

1
@cwd ลองใช้ls -pมันจะแสดง/หลังชื่อไดเรกทอรี ดังนั้น*/เป็นเพียงรูปแบบที่จับคู่กับชื่อไดเรกทอรีและ/คำสั่งผสม
Pitt

ฉันสร้างฟังก์ชั่นการใช้ @ คำตอบ Steven_D สำหรับ ~ / .bash_aliases ของฉัน file: gist.github.com/rjurney/998f4951a57bfa5daeb9a6c18f6f4827
rjurney

คำตอบ:


84

ฉันรู้ว่ามีคำตอบที่เลือกไว้แล้ว แต่คุณสามารถรับพฤติกรรมที่ร้องขอได้โดยใช้เพียงแค่ls:

ls -ld -- */

(โปรดทราบว่าเครื่องหมาย '-' ทำเครื่องหมายจุดสิ้นสุดของพารามิเตอร์ป้องกันไม่ให้ชื่อโฟลเดอร์ที่ขึ้นต้นด้วยยัติภังค์ถูกตีความเป็นตัวเลือกคำสั่งเพิ่มเติม)

สิ่งนี้จะแสดงรายการไดเรกทอรีที่ไม่ได้ซ่อนไว้ทั้งหมด (เว้นแต่คุณจะกำหนดค่า globs ของเชลล์เพื่อขยายออก) ในไดเรกทอรีการทำงานปัจจุบันที่มันทำงานอยู่ (โปรดทราบว่ามันยังมีลิงก์สัญลักษณ์ไปยังไดเรกทอรีด้วย) หากต้องการรับไดเรกทอรีย่อยทั้งหมดของโฟลเดอร์อื่นเพียงลอง:

ls -ld /path/to/directory/*/

โปรดทราบว่า -l เป็นทางเลือก


5
ดี ฉันไม่เคยคิดว่าไดเรกทอรีจะมีความหมาย/ในตอนท้าย แต่ตอนนี้ฉันเห็นคุณตอบแล้วมันสมเหตุสมผลแล้ว ท้ายที่สุดแล้วการทำให้แท็บเสร็จสมบูรณ์จะเพิ่มเข้าไปเสมอ
gvkv

-d for dir, -l for long format. วัตถุประสงค์ของ--อะไร
Dineshkumar

1
แม้ว่าจะดูสั้นและใช้งานได้ในกรณีส่วนใหญ่ แต่ก็อาจไม่ต้องการใช้วิธีนี้เมื่อต้องการไดเรกทอรีจริงไม่ใช่ symlink ของไดเรกทอรี ดังนั้นจึงfindเป็นทางเลือกที่ดีในกรณีนั้น
biocyberman

1
findยังมีข้อได้เปรียบเมื่อจำนวนไดเรกทอรีเกินความยาวอาร์กิวเมนต์สูงสุด
Steven D

เมื่อทำงานย้อนหลังฉันเพิ่งรู้ว่าคุณสามารถเพิกเฉยต่อสิ่งที่มีส่วนขยายls -alhF --ignore=*.*ได้ ไม่แน่ใจว่าวิธีนี้จะจัดการกับโฟลเดอร์ 'ที่ซ่อนอยู่' ได้ดีเพียงใด.myHiddenFolder
Timmah

14

ไม่ แต่findคำสั่งง่ายๆจะทำ:

find . -type d -depth 1

หรือ grep

ls -F | grep /

จากนั้นคุณสามารถใช้นามแฝงได้หากจำเป็น


6
บน Ubuntu 14.04 -maxdepth 1มันเป็น ยังfindต้องการให้ฉันพลิกคำสั่ง:find . -maxdepth 1 -type d
Brad Cupit

ls -F | grep /โซลูชันนั้นใช้งานได้อย่างมหัศจรรย์! ดูเหมือนว่าเป็นคนเดียวที่ฉันสามารถทำงานบนเครื่อง FreeBSD ของฉัน ฉันคิดว่าการใช้ Fish หมายความว่าอะไรก็ตามที่*/อาจไม่ทำงาน?
cjm

ฉันไม่เคยทำงานกับ Fish ดังนั้นฉันไม่แน่ใจเกี่ยวกับสิ่งนั้น แต่ตัวเลือก -F สามารถทำงานได้อย่างมหัศจรรย์
gvkv

7

ฉันชอบยูทิลิตี้ทรีเพื่อรับภาพรวมของโครงสร้างไดเรกทอรี มันมีอยู่ใน MacPorts และดิสทริบิวชัน Linux ทั้งหมดที่ฉันได้ลอง

tree -d -L 2

ที่จะแสดงไดเรกทอรีทั้งหมดลึกสองระดับ


6

ฉันต้องดูไดเรกทอรีที่ซ่อนอยู่ด้วยดังนั้นจึงได้แก้ไขคำแนะนำด้านบนเพื่อให้เหมาะกับความต้องการของฉัน

ls -d -- */ .*/

(ขึ้นอยู่กับเปลือกที่อาจรวมถึง.และ..)


2

ด้วยzsh(ตามค่าเริ่มต้นบน macOS แม้จะเคยอยู่ที่/bin/shนั่น) คุณจะต้องใช้โปรแกรมระบุคุณสมบัติแบบหมุนเพื่อเลือกไฟล์ตามประเภท:

  • รายการไดเรกทอรีที่ไม่ซ่อน:

    ls -d -- *(/)
    
  • รายการไดเรกทอรีทั้งหมด:

    ls -d -- *(D/)
    

    ( .และ..ได้รับการยกเว้นอยู่เสมอเพิ่มเป็นรายบุคคลหากคุณต้องการ)

  • รวมถึง symlink ไปยังไดเรกทอรี:

    ls -d -- *(D-/)
    

    ( -ทำให้มีคุณสมบัติเพิ่มเติมเพื่อนำไปใช้หลังจากการแก้ไข symlink)


-1

ฉันคิดว่า ls มีข้อผิดพลาดใน Mac OS X การแก้ปัญหาคือใช้ grep ... ls -l / | grep "^d"


1
เป็นเรื่องดีที่รู้ว่าฉันไม่ใช่คนเดียวที่ใช้grep "^d"แฮ็ค
Michael Mrozek

6
เท่าที่ฉันรู้พฤติกรรมที่เขาอธิบายไม่ใช่ข้อผิดพลาดและเหมือนกันถ้ามีใครใช้ GNU ls ตัวเลือก -d แสดงรายการของไดเรกทอรีและไม่ใช่เนื้อหา เพื่อดูว่าทำไมสิ่งนี้จึงมีประโยชน์ดูความแตกต่างระหว่าง: ls -l /homeและls -dl /home
Steven D

กะรัตไม่ได้พิเศษกับเปลือก ls -l / | grep ^dคุณก็สามารถใช้ หากคุณกำลังจะใช้คำพูดเพราะคุณไม่จำเป็นต้องมีการขยายตัวพารามิเตอร์ทำให้พวกเขาเดียวคำพูด ls -l / | grep '^d'. ใช่ฉันเป็นคนอวดรู้ แต่จริงๆทำเช่นนี้ :)
สัญลักษณ์แทน

-1
$ ls -p | grep /

การ-pตั้งค่าสถานะจะทำการlsเพิ่มเครื่องหมายทับ (`/ ') หลังจากแต่ละชื่อไฟล์หากไฟล์นั้นเป็นไดเรกทอรี


-2

วิธีที่ง่ายที่สุดคือการพิมพ์คำสั่งต่อไปนี้ สิ่งนี้ใช้ได้กับแพลตฟอร์มและเวอร์ชัน UNIX และ Linux ส่วนใหญ่ คุณสามารถข้าม-Fถ้าคุณต้องการ แต่มันเป็นอาร์กิวเมนต์ที่เพิ่ม / ไปยังจุดสิ้นสุดของชื่อไดเรกทอรี -Cอาร์กิวเมนต์จับชื่อไดเรกทอรีเท่านั้น - ทั้งหมดของพวกเขาในไดเรกทอรีปัจจุบัน หากคุณต้องการดูเฉพาะไดเรกทอรีและไดเรกทอรีย่อยในเส้นทางปัจจุบันเพียงเพิ่ม-Rอาร์กิวเมนต์ ( ls -CFR)

# ls -CF
/dir1  /dir2  /dir3  /beaches  /Work  /Other 

1
ในทุกlsการใช้งานและฉันรู้ว่าในสเปคของ POSIX ls, -Cคือการส่งออกในคอลัมน์ไม่ได้ที่จะข้ามไฟล์ที่ไม่ใช่ไดเรกทอรี ในตัวอย่างของคุณ/จะถูกพิมพ์ก่อนชื่อไฟล์ซึ่งจะไม่มีlsการนำไปใช้งาน ด้วย-F, /จะถูกผนวกเข้ากับชื่อไฟล์สำหรับไฟล์ไดเร็กทอรี
Stéphane Chazelas

เมื่อฉันเห็นคำตอบนี้ฉันสงสัยว่า“ ความจริงนี้อยู่ที่ไหน?” @ StéphaneChazelasและ Jeff Schaller - คุณไม่ตอบคำถามที่ผิดอย่างโจ่งแจ้งเลยเหรอ?
G-Man

-3
ls -G

จะแสดงไดเรกทอรีของคุณเป็นสีน้ำเงิน


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