วิธีแสดงโฟลเดอร์โดยใช้คำสั่ง bash


52

มีวิธีใดที่จะแสดงรายการเฉพาะโฟลเดอร์ในไดเรกทอรีโดยใช้คำสั่ง bash หรือไม่? (ตามlsคำสั่งแสดงรายการไฟล์และโฟลเดอร์ทั้งหมด)

คำตอบ:


66

คุณสามารถใช้ได้:

ls -d -- */

เนื่องจากไดเรกทอรีทั้งหมดสิ้นสุดลง/รายการนี้จะแสดงเฉพาะไดเรกทอรีในเส้นทางปัจจุบัน -dตัวเลือกที่ช่วยให้มั่นใจได้ว่ามีเพียงชื่อไดเรกทอรีจะพิมพ์ไม่เนื้อหาของพวกเขา


2
ls - * / แสดงรายการไดเรกทอรีทั้งหมดพร้อมเนื้อหาด้านล่าง
Vins

1
@ 8088 ความแตกต่างระหว่างls -d -- */และls -d */คืออะไร?
Louis

5
@Louis --ใช้เพื่อทำเครื่องหมายจุดสิ้นสุดของตัวเลือกตามอัตภาพดังนั้นหากไฟล์ชื่อ-lls จะไม่ตีความว่ามันเป็นตัวเลือกรูปแบบรายการแบบยาว
Cristian Ciupitu

28

คำตอบของสตีเฟ่นมาร์ตินให้คำเตือนและแสดงรายการโฟลเดอร์ปัจจุบันด้วยดังนั้นฉันขอแนะนำ

find . -mindepth 1 -maxdepth 1 -type d

(นี่เป็น Linux ฉันไม่สามารถหา -maxdepth และ -mindepth ใน POSIX man page เพื่อค้นหา)


1
คำถามที่เก่ากว่าฉันรู้ ในขณะที่ฉันจะหันไปหางานนี้ในตอนแรกฉันชอบls -d -- */ตัวเลือกเช่นเดียวกับที่findจะค้นหาเส้นทางที่ซ่อนอยู่ด้วย ซึ่งบางครั้งอาจมีประโยชน์ แต่บางครั้งก็ทำให้เกิดปัญหา ฉันหวังว่าความคิดเห็นนี้อาจช่วยผู้อื่น +1
จับคู่

12
find . -maxdepth 1 -type d

จะแสดงรายการเฉพาะโฟลเดอร์ และในขณะที่เท็ดดี้ชี้ให้เห็นคุณจะต้อง -maxdepth เพื่อหยุดมัน recusrsing เป็นย่อย dirs


5
คุณอาจต้องการ-maxdepth 1เช่นกัน
ตุ๊กตา

6

คำตอบของดาเนียลนั้นถูกต้อง นี่คือบางส่วนเพิ่มเติมที่มีประโยชน์

หากต้องการหลีกเลี่ยงการแสดงรายการโฟลเดอร์ที่ซ่อนอยู่ (เช่น.git) ลองสิ่งนี้:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \)

และเพื่อแทนที่จุดสแลชที่จุดเริ่มต้นของfindเอาต์พุตในบางสภาพแวดล้อมให้ใช้สิ่งนี้:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \) | sed 's|^\./||g'

1

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

หากคุณไม่ต้องการ ls หรือค้นหาคุณอาจต้องการลองกรอง "*" ด้วย "[-d]"

ฉันทำอย่างนั้นด้วยเหตุผลบางอย่าง ls และพบว่าไม่ได้ทำงาน (ชื่อไฟล์ที่มีช่องว่างและวงเล็บฉันเดาหรืออย่างอื่นที่ฉันมองข้าม) จากนั้นฉันก็ทำอะไรตามบรรทัดของ

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done

0

เพียงเพื่อเน้นสิ่งที่ทำให้ฉันสับสนในส่วนที่เกี่ยวกับการเลือกรูปแบบ glob; บอกว่าคุณมีสิ่งนี้:

$ cd /tmp
$ mkdir testglob
$ for ix in {00,01,02,03} ; do mkdir testglob/mydir_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/myfile_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/mydir_${ix}.txt ; done
$ for ix in {00,01,02,03} ; do mkdir testglob/otherdir_${ix} ; done
$ tree testglob/
testglob/
├── mydir_00
├── mydir_00.txt
├── mydir_01
├── mydir_01.txt
├── mydir_02
├── mydir_02.txt
├── mydir_03
├── mydir_03.txt
├── myfile_00
├── myfile_01
├── myfile_02
├── myfile_03
├── otherdir_00
├── otherdir_01
├── otherdir_02
└── otherdir_03

8 directories, 8 files

ดังนั้นพูดที่นี่คุณต้องการเลือกเฉพาะmydir*ไดเรกทอรี โปรดทราบว่าหากคุณออกจากเครื่องหมายทับซ้ายls -dจะแสดงรายการไฟล์เช่นกัน:

$ ls -d testglob/mydir*   # also `ls -d -- testglob/mydir*`
testglob/mydir_00      testglob/mydir_01      testglob/mydir_02      testglob/mydir_03
testglob/mydir_00.txt  testglob/mydir_01.txt  testglob/mydir_02.txt  testglob/mydir_03.txt

... อย่างไรก็ตามด้วยเครื่องหมายสแลชแล้วไดเรกทอรีเท่านั้นที่มีการระบุไว้:

$ ls -d testglob/mydir*/   # also `ls -d -- testglob/mydir*/`
testglob/mydir_00/  testglob/mydir_01/  testglob/mydir_02/  testglob/mydir_03/

0

printf "%s\n" */ จะแสดงรายการไดเรกทอรีทั้งหมดใน $ PWD

echo */ จะใช้งานได้ แต่ในหนึ่งบรรทัดยาวยากกว่าเมื่อชื่อมีช่องว่าง


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