การแสดงรายการเฉพาะไดเร็กทอรีใน UNIX


219

ฉันต้องการแสดงเฉพาะไดเรกทอรีในพา ธ ที่ระบุ ( lsไม่มีตัวเลือกดังกล่าว) นอกจากนี้สิ่งนี้สามารถทำได้ด้วยคำสั่งบรรทัดเดียว?


12
สำหรับอนาคต: บางทีคำถามพื้นฐานเกี่ยวกับยูนิกซ์ / ลินุกซ์ที่ไม่ยากที่เกี่ยวข้องกับการเขียนโปรแกรมจะดีกว่าที่นั่น: unix.stackexchange.com
echox

คำตอบ:


315

ลองใช้วิธีนี้ls -d */เพื่อแสดงรายการไดเรกทอรีภายในไดเรกทอรีปัจจุบัน


17
Hey, ที่สวยดีผมเคยใช้กับเราls -al | grep '^d'- นี้เป็นมากขึ้นรวบรัด
paxdiablo

43
ทำไมต้องใช้ * / ?? กรุณาอธิบาย!?
Chandeep

6
ฉันไม่มีคำอธิบายที่เหมาะสม แต่ฉันรู้ว่า*/บังคับให้แสดงเฉพาะรายการที่ลงท้ายด้วยเครื่องหมายสแลชซึ่งในกรณีนี้จะเป็นไดเรกทอรีแม้ว่าจะไม่ได้ใช้-Fตัวเลือก lsคล้ายกับพฤติกรรมls *phpและวิธีการที่จะแสดงไฟล์ทั้งหมดที่ลงท้ายด้วยphpในไดเรกทอรี
David Hancock

3
@ user975234 มีคนถามคำถามที่คล้ายกันและมีคำอธิบายที่ดีโพสต์ลิงค์
user1766760

17
ก็echo */จะทำเช่นเดียวกัน
nos

95

ลองสิ่งนี้:

find . -maxdepth 1 -type d

8
สำหรับฉันนี่ดูเหมือนจะเป็นวิธีที่ควรทำ แตกต่างจากlsโซลูชันที่แนะนำfindมีความรับผิดชอบ แต่เพียงผู้เดียวในการทำงาน (ไม่ต้องอาศัยการขยายตัวของสัญลักษณ์แทนเชลล์ซึ่งสามารถกำหนดขีด จำกัด ได้) นอกจากนี้ยังมีความรัดกุมมากขึ้น
เตอร์

1
สิ่งที่ไม่ดีเกี่ยวกับสิ่งนี้คือมันไม่ทำงานหากคุณพยายามวนซ้ำผลลัพธ์และผลลัพธ์ของคุณมีช่องว่างในชื่อ
ubiquibacon

2
find * -maxdepth 0 -type dหรือถ้าคุณไม่ต้องการที่จะรวมถึงไดเรกทอรีของตัวเอง:
James Ko

@ubiquibacon ทั้งการใช้งานfind's -print0หรือ-execตัวเลือก

1
นี่ช้าจริงๆอย่างน้อยใน Mac ของฉัน มันดูเหมือนว่าจะทำค้นหาแบบเต็ม recursive ที่findมักจะไม่ แต่การส่งออกเพียงโฟลเดอร์ที่ระดับความลึก 1
Kara Brightwell

22

ดังต่อไปนี้

find * -maxdepth 0 -type d

โดยทั่วไปกรองการขยายตัวของ '*' นั่นคือรายการทั้งหมดใน dir ปัจจุบันตาม-type dเงื่อนไข

ข้อดีคือเอาต์พุตจะเหมือนกันls -1 *แต่เฉพาะกับไดเรกทอรีและรายการเท่านั้นที่ไม่ได้ขึ้นต้นด้วยจุด


13

คุณสามารถใช้ls -d */หรือtree -d

โซลูชันอื่นจะเป็นแบบวงกลม แต่ขึ้นอยู่กับเชลล์ที่คุณใช้และหากสนับสนุนแบบวงกลมสำหรับไดเรกทอรี

ตัวอย่างเช่น ZSH:

zsh # ls *(/)

3
คุณได้กลิ่นอะไรของ Unix บ้างtree?
Johnsyweb

ลินุกซ์รายใหญ่ทุกตัวต่างมีปัญหาเช่นกัน? ขอโทษฉันไม่ได้รับคำถาม?
echox

1
ฉันมี Debian distro และtreeไม่มีการติดตั้งตามค่าเริ่มต้น (แม้ว่าจะอยู่ในที่เก็บ)
สตีเฟ่น Schrauger

1
Downvotes เนื่องจากฉันเชื่อว่าtreeคำสั่งไม่ใช่คำสั่ง unix ดั้งเดิม (โปรดแก้ไขฉันหากฉันผิด)
Tiago Cardoso

10

เนื่องจากมีหลายวิธีที่จะทำนี่คืออีกวิธีหนึ่ง:

tree -d -L 1 -i --noreport
  • -d: ไดเรกทอรี
  • -L: ความลึกของต้นไม้ (ด้วยเหตุนี้ 1, ไดเรกทอรีการทำงานของเรา)
  • -i: ไม่เยื้องพิมพ์ชื่อเท่านั้น
  • - รายงาน: อย่ารายงานข้อมูลในตอนท้ายของรายการต้นไม้

และขอบคุณที่อธิบายสวิตช์ Stack Overflow เป็นเรื่องเกี่ยวกับคำตอบฉันยินดีเสมอเมื่อคนทำเช่นเดียวกับคุณพร้อมคำอธิบายเทียบกับ "แค่อ่านรายการคน!" <- นั่นไม่ใช่คำตอบ
fusion27

ในการเริ่มต้นจากบรรทัดที่ 2 (ข้ามบรรทัดโดยมีเพียงจุด):tree -d -L 1 -i --noreport | tail -n +2
adius

นี่เป็นโซลูชันอันดับสูงสุดที่แสดงรายการไดเรกทอรีที่ลิงก์อย่างอ่อนและทำในลักษณะที่มีประโยชน์โดยเปิดเผยเป็นลิงก์ ฉันชอบความหลากหลาย:tree -C -d -L 1 -i --noreport | tail -n+2
Amnon Harel

9
ls -l | grep '^d'

คุณสามารถสร้างนามแฝงและวางลงในไฟล์โปรไฟล์

alias ld="ls -l| grep '^d'"

1
ลิงก์ไม่ถูกดูด้วยคำสั่งนี้ และลิงก์สามารถเป็นไฟล์หรือไดเรกทอรี ตัวอย่าง: lrwxrwxrwx 1 รูท 21 avril 15 17:38 cron -> / lib / init / upstart-job
c-toesca


6

เพื่อแสดงรายการไดเรกทอรีในไดเรกทอรีการทำงานปัจจุบัน ls -d */สามารถใช้งานได้ และหากคุณต้องการแสดงรายการไดเรกทอรีที่ซ่อนอยู่ให้ใช้คำสั่งนี้ ls -d .*/


6

ใช้สิ่งนี้เพื่อรับรายการไดเรกทอรี

ls -d */ | sed -e "s/\///g"

ls -d <custom-directory-path> | sed -e "s / \ /// g" ไม่ทำงาน .. มีปม?
Dhwanit

ขอบคุณ! ฉันแค่ต้องการรายชื่อไดเรกทอรีโดยไม่มีสิทธิ์ทั้งหมดและนี่ก็เป็นกลอุบาย :)
codingjeremy

5

find specifiedpath -type d

หากคุณไม่ต้องการเรียกเก็บเงินคืนในไดเรกทอรีย่อยคุณสามารถทำได้แทน:

find specifiedpath -type d -mindepth 1 -maxdepth 1

โปรดทราบว่าไดเรกทอรี "จุด" (ชื่อขึ้นต้นด้วย.) จะถูกแสดงเช่นกัน แต่ไม่ไดเรกทอรีพิเศษมิได้. ..หากคุณไม่ต้องการไดเรกทอรี "จุด" คุณสามารถgrepออกได้:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'


1
โหวตขึ้นจากการกล่าวถึงmindepthเพื่อกำจัด.! 😁
adius

5

คำตอบจะขึ้นอยู่กับเปลือกของคุณเปลือก

ในzshตัวอย่างเช่นคุณสามารถทำสิ่งต่อไปนี้:

echo *(/)

และไดเรกทอรีทั้งหมดภายในไดเรกทอรีการทำงานปัจจุบันจะปรากฏขึ้น

ดู man zshexpnข้อมูลเพิ่มเติม

ทางเลือกอื่นคือใช้find(1)ซึ่งควรทำงานกับ Unix รสมากที่สุด:

find . -maxdepth 1 -type d -print  

find(1)man findมีประโยชน์หลายอย่างดังนั้นแน่นอนผมอยากแนะนำให้


4

คุณสามารถใช้treeคำสั่งพร้อมdสวิตช์เพื่อทำสิ่งนี้ให้สำเร็จ

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

ดูman treeข้อมูลเพิ่มเติม


ฉันไม่ได้ลงคะแนนเพียงมีคำถามเดียวกัน ดูเหมือนว่าคำตอบของคุณคือล่อลวงของ echox อาจเป็นเพราะอะไร
Louis Waweru

1
@Louis - treeขอบคุณฉันไม่เคยสังเกตเห็นแม้กระทั่งการพูดถึงของเขา โอ้ฉันไม่ได้ตั้งใจจะขโมยฟ้าร้องของใคร
slm

upvoting สำหรับการมองเห็นสิ่งที่ต้นไม้ทำ
Andrejs

ฉันเชื่อว่า downvotes นั้นเป็นเพราะมันเป็นคำตอบเดียวกับ stackoverflow.com/a/3667405/523742
Tiago Cardoso

@TiagoCardoso - ของฉันมีมาก่อนหนึ่งปี
slm

2

ถ้าฉันมีไดเรกทอรีนี้:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

ในการรับไดเร็กทอรีทั้งหมดให้ใช้ -L เพื่อแก้ไขลิงก์:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

ไม่มี - L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

ไม่มีไดเร็กทอรีconf_nagios



1

สิ่งนี้ได้ผลสำหรับฉัน:

`ls -F | grep /`

(แต่ฉันเปลี่ยนecho */เป็นที่กล่าวถึงโดย @nos)


1

นี่เป็นอีกวิธีการหนึ่งที่แสดงไดเรกทอรีที่ลิงก์ ฉันชอบมันเล็กน้อยเพราะเป็นเซตย่อยของเอาต์พุต "ปกติ" ls -l:

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always

1

ในทุบตี:

ls -d */

จะแสดงรายการไดเรกทอรีทั้งหมด

ls -ld */

จะแสดงรายการไดเรกทอรีทั้งหมดในรูปแบบยาว

ls -ld */ .*/

จะแสดงรายการไดเรกทอรีทั้งหมดรวมถึงไดเรกทอรีที่ซ่อนอยู่ในรูปแบบยาว


ฉันเพิ่งเปลี่ยนเป็น zsh (MacOS Catalina) และพบว่า:

ls -ld */ .*/

ไม่ทำงานอีกต่อไปหากไดเรกทอรีปัจจุบันไม่มีไดเรกทอรีที่ซ่อนอยู่

zsh: no matches found: .*/

มันจะพิมพ์ข้อผิดพลาดดังกล่าว แต่จะไม่สามารถพิมพ์ไดเรกทอรีใด ๆ

ls -ld *(/) .*(/)

ก็ล้มเหลวในลักษณะเดียวกัน

จนถึงตอนนี้ฉันได้พบว่าสิ่งนี้:

ls -ld */;ls -ld .*/

เป็นวิธีแก้ปัญหาที่ดี ;เป็นตัวคั่นคำสั่ง แต่หมายความว่าหากไม่มีไดเรกทอรีที่ซ่อนอยู่ก็จะแสดงรายการไดเรกทอรีและยังพิมพ์ข้อผิดพลาดสำหรับไม่มีไดเรกทอรีที่ซ่อนอยู่:

foo
bar
zsh: no matches found: .*/

lsเป็นคำสั่งของเชลล์สำหรับเนื้อหารายการไดเรกทอรีปัจจุบัน
-lเป็นธงที่จะระบุว่าคุณต้องการไปยังรายการใน Longford (หนึ่งรายการต่อบรรทัด + พวงของข้อมูลเย็นอื่น ๆ )
-dเป็นธงในรายการไดเรกทอรีทั้งหมด "เป็นไฟล์" และไม่ซ้ำ
*/คือ อาร์กิวเมนต์ 'รายการไฟล์ทั้งหมดที่ลงท้ายด้วยสแลช'
*เป็นคำสั่ง regex อย่างง่ายสำหรับ "อะไร" ดังนั้น*/ขอให้เชลล์แสดงรายการ "อะไรก็ตามที่ลงท้ายด้วย '/'"

ดูman lsข้อมูลเพิ่มเติม


ฉันใส่สิ่งนี้:

alias lad="ls -ld */;ls -ld .*/"

ใน. zshrc ของฉันและดูเหมือนว่าจะทำงานได้ดี

หมายเหตุ: ฉันได้ค้นพบสิ่งนั้นด้วย

ls -ld .*/ 2> /dev/null

ไม่ทำงานเนื่องจากยังคงพิมพ์ sterr ไปยังเทอร์มินัล ฉันจะอัปเดตคำตอบของฉันถ้า / เมื่อฉันหาวิธีแก้ปัญหา


0

du -d1อาจเป็นตัวเลือกที่สั้นที่สุด (ตราบใดที่คุณไม่จำเป็นต้องไพพ์อินพุตไปยังคำสั่งอื่น)


0

ในการแสดงรายการเฉพาะไดเรกทอรีในเส้นทางที่ระบุให้พิมพ์ ls -l | grep drw


สิ่งนี้อาจรวมถึงไฟล์หากชื่อไฟล์ใด ๆ รวมอยู่drwและจะยกเว้นไดเรกทอรีที่ไม่สามารถอ่านและเขียนได้ grep ^dทำงานได้ดีขึ้น
Tom Zych

0

รายการยาวของไดเรกทอรี

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

รายชื่อไดเรกทอรี
- ls -d * /


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