มีวิธีใดที่จะแสดงรายการเฉพาะโฟลเดอร์ในไดเรกทอรีโดยใช้คำสั่ง bash หรือไม่? (ตามls
คำสั่งแสดงรายการไฟล์และโฟลเดอร์ทั้งหมด)
มีวิธีใดที่จะแสดงรายการเฉพาะโฟลเดอร์ในไดเรกทอรีโดยใช้คำสั่ง bash หรือไม่? (ตามls
คำสั่งแสดงรายการไฟล์และโฟลเดอร์ทั้งหมด)
คำตอบ:
คุณสามารถใช้ได้:
ls -d -- */
เนื่องจากไดเรกทอรีทั้งหมดสิ้นสุดลง/
รายการนี้จะแสดงเฉพาะไดเรกทอรีในเส้นทางปัจจุบัน -dตัวเลือกที่ช่วยให้มั่นใจได้ว่ามีเพียงชื่อไดเรกทอรีจะพิมพ์ไม่เนื้อหาของพวกเขา
ls -d -- */
และls -d */
คืออะไร?
--
ใช้เพื่อทำเครื่องหมายจุดสิ้นสุดของตัวเลือกตามอัตภาพดังนั้นหากไฟล์ชื่อ-l
ls จะไม่ตีความว่ามันเป็นตัวเลือกรูปแบบรายการแบบยาว
คำตอบของสตีเฟ่นมาร์ตินให้คำเตือนและแสดงรายการโฟลเดอร์ปัจจุบันด้วยดังนั้นฉันขอแนะนำ
find . -mindepth 1 -maxdepth 1 -type d
(นี่เป็น Linux ฉันไม่สามารถหา -maxdepth และ -mindepth ใน POSIX man page เพื่อค้นหา)
ls -d -- */
ตัวเลือกเช่นเดียวกับที่find
จะค้นหาเส้นทางที่ซ่อนอยู่ด้วย ซึ่งบางครั้งอาจมีประโยชน์ แต่บางครั้งก็ทำให้เกิดปัญหา ฉันหวังว่าความคิดเห็นนี้อาจช่วยผู้อื่น +1
find . -maxdepth 1 -type d
จะแสดงรายการเฉพาะโฟลเดอร์ และในขณะที่เท็ดดี้ชี้ให้เห็นคุณจะต้อง -maxdepth เพื่อหยุดมัน recusrsing เป็นย่อย dirs
-maxdepth 1
เช่นกัน
คำตอบของดาเนียลนั้นถูกต้อง นี่คือบางส่วนเพิ่มเติมที่มีประโยชน์
หากต้องการหลีกเลี่ยงการแสดงรายการโฟลเดอร์ที่ซ่อนอยู่ (เช่น.git
) ลองสิ่งนี้:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \)
และเพื่อแทนที่จุดสแลชที่จุดเริ่มต้นของfind
เอาต์พุตในบางสภาพแวดล้อมให้ใช้สิ่งนี้:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g'
คุณ "ไม่ควร" แยกวิเคราะห์ผลลัพธ์ของ ls หรือว่ากันว่า เหตุผลที่อยู่เบื้องหลังคือเอาท์พุทมีจุดประสงค์เพื่อให้มนุษย์อ่านได้และสามารถทำให้แยกวิเคราะห์ได้ยากโดยไม่จำเป็นหากฉันจำได้
หากคุณไม่ต้องการ ls หรือค้นหาคุณอาจต้องการลองกรอง "*" ด้วย "[-d]"
ฉันทำอย่างนั้นด้วยเหตุผลบางอย่าง ls และพบว่าไม่ได้ทำงาน (ชื่อไฟล์ที่มีช่องว่างและวงเล็บฉันเดาหรืออย่างอื่นที่ฉันมองข้าม) จากนั้นฉันก็ทำอะไรตามบรรทัดของ
for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
เพียงเพื่อเน้นสิ่งที่ทำให้ฉันสับสนในส่วนที่เกี่ยวกับการเลือกรูปแบบ 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/
printf "%s\n" */
จะแสดงรายการไดเรกทอรีทั้งหมดใน $ PWD
echo */
จะใช้งานได้ แต่ในหนึ่งบรรทัดยาวยากกว่าเมื่อชื่อมีช่องว่าง
คุณยังสามารถใช้:
du
หรือ:
git ls-tree -d -r --name-only @