ฉันต้องการแสดงเฉพาะไดเรกทอรีในพา ธ ที่ระบุ ( ls
ไม่มีตัวเลือกดังกล่าว) นอกจากนี้สิ่งนี้สามารถทำได้ด้วยคำสั่งบรรทัดเดียว?
ฉันต้องการแสดงเฉพาะไดเรกทอรีในพา ธ ที่ระบุ ( ls
ไม่มีตัวเลือกดังกล่าว) นอกจากนี้สิ่งนี้สามารถทำได้ด้วยคำสั่งบรรทัดเดียว?
คำตอบ:
ลองใช้วิธีนี้ls -d */
เพื่อแสดงรายการไดเรกทอรีภายในไดเรกทอรีปัจจุบัน
ls -al | grep '^d'
- นี้เป็นมากขึ้นรวบรัด
*/
บังคับให้แสดงเฉพาะรายการที่ลงท้ายด้วยเครื่องหมายสแลชซึ่งในกรณีนี้จะเป็นไดเรกทอรีแม้ว่าจะไม่ได้ใช้-F
ตัวเลือก ls
คล้ายกับพฤติกรรมls *php
และวิธีการที่จะแสดงไฟล์ทั้งหมดที่ลงท้ายด้วยphp
ในไดเรกทอรี
echo */
จะทำเช่นเดียวกัน
ลองสิ่งนี้:
find . -maxdepth 1 -type d
ls
โซลูชันที่แนะนำfind
มีความรับผิดชอบ แต่เพียงผู้เดียวในการทำงาน (ไม่ต้องอาศัยการขยายตัวของสัญลักษณ์แทนเชลล์ซึ่งสามารถกำหนดขีด จำกัด ได้) นอกจากนี้ยังมีความรัดกุมมากขึ้น
find * -maxdepth 0 -type d
หรือถ้าคุณไม่ต้องการที่จะรวมถึงไดเรกทอรีของตัวเอง:
find
มักจะไม่ แต่การส่งออกเพียงโฟลเดอร์ที่ระดับความลึก 1
ดังต่อไปนี้
find * -maxdepth 0 -type d
โดยทั่วไปกรองการขยายตัวของ '*' นั่นคือรายการทั้งหมดใน dir ปัจจุบันตาม-type d
เงื่อนไข
ข้อดีคือเอาต์พุตจะเหมือนกันls -1 *
แต่เฉพาะกับไดเรกทอรีและรายการเท่านั้นที่ไม่ได้ขึ้นต้นด้วยจุด
คุณสามารถใช้ls -d */
หรือtree -d
โซลูชันอื่นจะเป็นแบบวงกลม แต่ขึ้นอยู่กับเชลล์ที่คุณใช้และหากสนับสนุนแบบวงกลมสำหรับไดเรกทอรี
ตัวอย่างเช่น ZSH:
zsh # ls *(/)
tree
?
tree
ไม่มีการติดตั้งตามค่าเริ่มต้น (แม้ว่าจะอยู่ในที่เก็บ)
tree
คำสั่งไม่ใช่คำสั่ง unix ดั้งเดิม (โปรดแก้ไขฉันหากฉันผิด)
เนื่องจากมีหลายวิธีที่จะทำนี่คืออีกวิธีหนึ่ง:
tree -d -L 1 -i --noreport
tree -d -L 1 -i --noreport | tail -n +2
tree -C -d -L 1 -i --noreport | tail -n+2
ls -l | grep '^d'
คุณสามารถสร้างนามแฝงและวางลงในไฟล์โปรไฟล์
alias ld="ls -l| grep '^d'"
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
เพื่อแสดงรายการไดเรกทอรีในไดเรกทอรีการทำงานปัจจุบัน
ls -d */
สามารถใช้งานได้ และหากคุณต้องการแสดงรายการไดเรกทอรีที่ซ่อนอยู่ให้ใช้คำสั่งนี้
ls -d .*/
ใช้สิ่งนี้เพื่อรับรายการไดเรกทอรี
ls -d */ | sed -e "s/\///g"
find specifiedpath -type d
หากคุณไม่ต้องการเรียกเก็บเงินคืนในไดเรกทอรีย่อยคุณสามารถทำได้แทน:
find specifiedpath -type d -mindepth 1 -maxdepth 1
โปรดทราบว่าไดเรกทอรี "จุด" (ชื่อขึ้นต้นด้วย.
) จะถูกแสดงเช่นกัน แต่ไม่ไดเรกทอรีพิเศษมิได้.
..
หากคุณไม่ต้องการไดเรกทอรี "จุด" คุณสามารถgrep
ออกได้:
find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
mindepth
เพื่อกำจัด.
! 😁
คำตอบจะขึ้นอยู่กับเปลือกของคุณเปลือก
ในzsh
ตัวอย่างเช่นคุณสามารถทำสิ่งต่อไปนี้:
echo *(/)
และไดเรกทอรีทั้งหมดภายในไดเรกทอรีการทำงานปัจจุบันจะปรากฏขึ้น
ดู man zshexpn
ข้อมูลเพิ่มเติม
ทางเลือกอื่นคือใช้find(1)
ซึ่งควรทำงานกับ Unix รสมากที่สุด:
find . -maxdepth 1 -type d -print
find(1)
man find
มีประโยชน์หลายอย่างดังนั้นแน่นอนผมอยากแนะนำให้
คุณสามารถใช้tree
คำสั่งพร้อมd
สวิตช์เพื่อทำสิ่งนี้ให้สำเร็จ
% tree -d tstdir
tstdir
|-- d1
| `-- d11
| `-- d111
`-- d2
`-- d21
`-- d211
6 directories
ดูman tree
ข้อมูลเพิ่มเติม
tree
ขอบคุณฉันไม่เคยสังเกตเห็นแม้กระทั่งการพูดถึงของเขา โอ้ฉันไม่ได้ตั้งใจจะขโมยฟ้าร้องของใคร
ถ้าฉันมีไดเรกทอรีนี้:
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
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"
สิ่งนี้ได้ผลสำหรับฉัน:
`ls -F | grep /`
(แต่ฉันเปลี่ยนecho */
เป็นที่กล่าวถึงโดย @nos)
นี่เป็นอีกวิธีการหนึ่งที่แสดงไดเรกทอรีที่ลิงก์ ฉันชอบมันเล็กน้อยเพราะเป็นเซตย่อยของเอาต์พุต "ปกติ" ls -l:
ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always
ในทุบตี:
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 ไปยังเทอร์มินัล ฉันจะอัปเดตคำตอบของฉันถ้า / เมื่อฉันหาวิธีแก้ปัญหา
du -d1
อาจเป็นตัวเลือกที่สั้นที่สุด (ตราบใดที่คุณไม่จำเป็นต้องไพพ์อินพุตไปยังคำสั่งอื่น)
ในการแสดงรายการเฉพาะไดเรกทอรีในเส้นทางที่ระบุให้พิมพ์ ls -l | grep drw
drw
และจะยกเว้นไดเรกทอรีที่ไม่สามารถอ่านและเขียนได้ grep ^d
ทำงานได้ดีขึ้น
รายการยาวของไดเรกทอรี
รายชื่อไดเรกทอรี
- ls -d * /