รายการไดเรกทอรีเฉพาะการใช้ ls ใน Bash?


954

คำสั่งนี้จะแสดงรายการไดเรกทอรีในเส้นทางปัจจุบัน: ls -d */

รูปแบบที่แน่นอน*/ทำอะไร?

และเราจะให้เส้นทางแบบสัมบูรณ์ในคำสั่งด้านบน (เช่นls -d /home/alice/Documents) เพื่อแสดงรายการเฉพาะไดเรกทอรีในเส้นทางนั้นได้อย่างไร


7
ดูการแก้ไขคำตอบนี้unix.stackexchange.com/a/75047/32647อธิบาย-dถึงความหมายที่แท้จริง
Evgeni Sergeev

คำตอบ:


991

*/เป็นรูปแบบที่ตรงกับไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีปัจจุบัน ( *จะตรงกับไฟล์และไดเรกทอรีย่อยทั้งหมดนั้น/จะ จำกัด เฉพาะไดเรกทอรี) ในทำนองเดียวกันเมื่อต้องการแสดงรายการไดเรกทอรีย่อยทั้งหมดภายใต้ / home / alice / Documents ให้ใช้ls -d /home/alice/Documents/*/


88
โปรดทราบว่า*/จะไม่ตรงกับโฟลเดอร์ใด ๆ ที่ซ่อนอยู่ หากต้องการรวมพวกเขาระบุพวกเขาชอบอย่างชัดเจนls -d .*/ */หรือตั้งค่าdotglobตัวเลือกใน Bash
Gergő

1
@ytpillai เกิดขึ้นเนื่องจากไม่มีรายการย่อย คุณได้รับข้อผิดพลาดนั้นเมื่อใดก็ตามที่คุณใช้lsกับสิ่งที่ไม่มีอยู่
Gordon Davisson

1
เอาล่ะฉันตรวจสอบแล้วตอนนี้และปรากฎว่าไดเรกทอรีเดียวคือโฟลเดอร์รูท
ytpillai

1
@GordonDavisson ข้อความของความล้มเหลวสามารถหลีกเลี่ยงได้ด้วย bash ตัวเลือกshopt -s nullglob

4
@BinaryZebra Setting nullglob จะหลีกเลี่ยงข้อความแสดงข้อผิดพลาด แต่จะทำให้เกิดความสับสนมากยิ่งขึ้น: ด้วย nullglob set และไม่มีไดเรกทอรีย่อยls */จะขยายเป็นเพียงlsซึ่งจะแสดงรายการไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน ฉันค่อนข้างแน่ใจว่านั่นไม่ใช่สิ่งที่คุณต้องการในกรณีนี้
Gordon Davisson

481

สี่วิธีในการทำสิ่งนี้ให้สำเร็จแต่ละรูปแบบมีเอาต์พุตที่แตกต่างกัน

1. การใช้ echo

ตัวอย่าง: echo */, echo */*/
นี่คือสิ่งที่ผมได้รับ:

cs/ draft/ files/ hacks/ masters/ static/  
cs/code/ files/images/ static/images/ static/stylesheets/  

2. ใช้lsเท่านั้น

ตัวอย่าง: ls -d */
นี่คือสิ่งที่ฉันได้รับ:

cs/     files/      masters/  
draft/  hacks/      static/  

หรือเป็นรายการ (พร้อมข้อมูลรายละเอียด): ls -dl */

3. การใช้lsและgrep

ตัวอย่าง: ls -l | grep "^d" นี่คือสิ่งที่ฉันได้รับ:

drwxr-xr-x  24 h  staff     816 Jun  8 10:55 cs  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 draft  
drwxr-xr-x   9 h  staff     306 Jun  8 10:55 files  
drwxr-xr-x   2 h  staff      68 Jun  9 13:19 hacks  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 masters  
drwxr-xr-x   4 h  staff     136 Jun  8 10:55 static  

4. Bash Script (ไม่แนะนำสำหรับชื่อไฟล์ที่มีช่องว่าง)

ตัวอย่าง: for i in $(ls -d */); do echo ${i%%/}; done
นี่คือสิ่งที่ฉันได้รับ:

cs  
draft  
files  
hacks  
masters  
static

หากคุณต้องการให้ '/' เป็นอักขระสิ้นสุดคำสั่งจะเป็น: for i in $(ls -d */); do echo ${i}; done

cs/  
draft/  
files/  
hacks/  
masters/  
static/

2
NB 3ช้ากว่าคนอื่นอย่างเห็นได้ชัดสำหรับฉัน ในไดเรกทอรีฉันทดสอบ: 1.012s, 2.016s, 3 .055s , 4.021s
isomorphismes

@ isomorphismes คุณวัดเวลาได้อย่างไร หมายความว่าอย่างไร โดยวิธีการที่ฉันต้องบอกว่าไม่มี1เป็นที่ชื่นชอบ
อัลเบิร์ต

อัลเบิร์ตฉันใช้timeฟังก์ชัน Unix แล้ว /// ฉันยอมรับคือฉลาดกว่าecho */ ls -d */
isomorphismes

9
สองสิ่งเล็ก ๆ น้อย ๆ ที่คุณควรทราบ ls -l | grep "^ d" กรองลิงก์สัญลักษณ์ไปยังไดเรกทอรีในขณะที่ 'ls -d * /' แสดง นอกจากนี้ 'ls -d * /' จะล้มเหลวหากไม่มีไดเรกทอรีอยู่เลยในไดเรกทอรีเป้าหมาย
Zoran Pavlovic

15
1.ตัวเลือกที่จะทำให้เกิดการปวดที่สำคัญเมื่อต้องรับมือกับชื่อโฟลเดอร์ที่มีช่องว่าง
Shrikant Sharat

99

ฉันใช้:

ls -d */ | cut -f1 -d'/'

สิ่งนี้สร้างคอลัมน์เดี่ยวที่ไม่มีเครื่องหมายสแลชต่อท้าย - มีประโยชน์ในสคริปต์

สองเซ็นต์ของฉัน


18
-1ตัวเลือกสำหรับการส่งออกจะอยู่ในรูปแบบคอลัมน์เดียวเช่นกันในขณะที่ls ls -1 -d */
Kalin

3
@ user29020 ควรทราบว่า-1ยังคงส่งออกเครื่องหมายทับต่อท้ายสำหรับทุกรายการ
เดนนิส

เมื่อฉันเพิ่มสิ่งนี้.bashrcเป็นนามแฝงฉันจะเพิ่มได้'/'อย่างไร
RNA

@RNA ล่าช้าที่จะตอบ แต่สำหรับคนในอนาคต: ลองหนีด้วยแบ็กสแลช? '\/'
Caek

1
แตกถ้ามีเครื่องหมายทับ วิธีนี้จะลบเครื่องหมายสแลชต่อท้ายเท่านั้น:| sed -e 's-/$--'
Victor Sergienko

62

สำหรับโฟลเดอร์ทั้งหมดที่ไม่มีโฟลเดอร์ย่อย:

find /home/alice/Documents -maxdepth 1 -type d

สำหรับโฟลเดอร์ทั้งหมดที่มีโฟลเดอร์ย่อย:

find /home/alice/Documents -type d

2
เพื่อให้ตรงกับคำถาม (แต่รวมถึง dotfiles) สิ่งแรกที่ควรจะเป็น: find /home/alice/Documents -maxdepth 1 -mindepth 1 -type dมิฉะนั้นคุณจะต้องรวม/home/alice/Documentsตัวมันเอง หากต้องการรวมลิงก์ไปยังไดเรกทอรีให้นำหน้าด้วย-L
jhnc

ดูเหมือนว่าโซลูชัน sanest เนื่องจาก find เป็นเครื่องมือที่สร้างขึ้นสำหรับงานนี้ คุณสามารถยกเว้นผลลัพธ์แรก - ./ สำหรับไดเรกทอรีปัจจุบัน - โดยไปที่ grep -v '^ \ ./$'
siliconrockstar

38

4 (เพิ่มเติม) ตัวเลือกที่เชื่อถือได้

unquotedดอกจัน*จะถูกตีความว่าเป็นรูปแบบ (glob) โดยเปลือก
เชลล์จะใช้มันในการขยายชื่อพา ธ
จากนั้นจะสร้างรายการชื่อไฟล์ที่ตรงกับรูปแบบ
เครื่องหมายดอกจันแบบง่ายจะตรงกับชื่อไฟล์ทั้งหมดใน PWD (ไดเรกทอรีทำงานปัจจุบัน)
รูปแบบที่ซับซ้อนยิ่งขึ้นซึ่ง*/จะตรงกับชื่อไฟล์ทั้งหมดที่ลงท้าย/ด้วย
ดังนั้นไดเรกทอรีทั้งหมด นั่นคือเหตุผลที่คำสั่ง:

1.- เสียงสะท้อน

echo */
echo ./*/              ### avoid misinterpreting filenames like "-e dir"

จะถูกขยาย (โดยเชลล์) ไปยังechoไดเรกทอรีทั้งหมดใน PWD


หากต้องการทดสอบสิ่งนี้: สร้างไดเรกทอรี ( mkdir) ชื่อ like test-dir และcdเข้าไปในนั้น:

mkdir test-dir; cd test-dir

สร้างไดเรกทอรีบางส่วน:

mkdir {cs,files,masters,draft,static}   # safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces}  # some a bit less secure.
touch -- 'file with spaces' '-a' '-l' 'filename'    # and some files:

คำสั่งecho ./*/จะยังคงเชื่อถือได้แม้จะมีชื่อไฟล์แปลก ๆ :

./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/

แต่ช่องว่างในชื่อไฟล์ทำให้การอ่านสับสนเล็กน้อย


หากechoเราใช้lsแทนเชลล์จะเป็นสิ่งที่กำลังขยายรายชื่อไฟล์ เชลล์เป็นเหตุผลในการรับรายการไดเรกทอรีใน PWD -dตัวเลือกที่จะlsทำให้รายการรายการไดเรกทอรีปัจจุบันแทนของเนื้อหาของแต่ละ directory (ตามที่นำเสนอโดยค่าเริ่มต้น)

ls -d */

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

2.- ls

GNU lsจะยอมรับปุ่ม "end of options" ( --)

ls -d ./*/                     ### more reliable BSD ls
ls -d -- */                    ### more reliable GNU ls

3. printf

ในการแสดงรายการแต่ละไดเรกทอรีในบรรทัดของตนเอง (ในหนึ่งคอลัมน์คล้ายกับ ls -1) ให้ใช้:

$ printf "%s\n" */        ### Correct even with "-", spaces or newlines.

และยิ่งกว่านั้นเราสามารถลบการติดตามได้/:

$ set -- */; printf "%s\n" "${@%/}"        ### Correct with spaces and newlines.

ความพยายามเช่นนี้:

$ for i in $(ls -d */); do echo ${i%%/}; done

จะล้มเหลวเมื่อ:

  • บางชื่อ ( ls -d */) ตามที่แสดงไว้ข้างต้น
  • IFSจะได้รับผลกระทบจากค่าของ
  • จะแยกชื่อในช่องว่างและแท็บ (โดยค่าเริ่มต้นIFS)
  • แต่ละบรรทัดใหม่ในชื่อจะเริ่มคำสั่ง echo ใหม่

4.- ฟังก์ชั่น

ในที่สุดการใช้รายการอาร์กิวเมนต์ภายในฟังก์ชันจะไม่ส่งผลกระทบต่อรายการอาร์กิวเมนต์ของเชลล์ที่กำลังรันอยู่ เพียง:

$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs

นำเสนอรายการนี้:

--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var

ตัวเลือกนี้ปลอดภัยด้วยชื่อไฟล์แปลก ๆ หลายประเภท


ฉันคิดว่าคุณควรแทนที่คำว่าปลอดภัยด้วยความน่าเชื่อถือ โพสต์ของคุณทำให้ฉันคิดว่าโซลูชันอื่น ๆ นั้น 'ไม่ปลอดภัย' (มีช่องโหว่หรือใช้ประโยชน์ได้)
Amado Martinez

1
@AmadoMartinez ทำ s ทั่วไปปลอดภัย / เชื่อถือได้ / ดีขึ้นหรือไม่

21

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

$ tree
.
├── config.dat
├── data
   ├── data1.bin
   ├── data2.inf
   └── sql
|      └── data3.sql
├── images
   ├── background.jpg
   ├── icon.gif
   └── logo.jpg
├── program.exe
└── readme.txt

แต่ถ้าเราต้องการเพียงไดเรกทอรีโดยไม่มีต้นไม้ ascii และมีเส้นทางแบบเต็มจากไดเรกทอรีปัจจุบันคุณสามารถทำได้:

$ tree -dfi
.
./data
./data/sql
./images

ข้อโต้แย้งถูก:

-d     List directories only.
-f     Prints the full path prefix for each file.
-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

และถ้าคุณต้องการเส้นทางสัมบูรณ์คุณสามารถเริ่มต้นด้วยการระบุเส้นทางแบบเต็มไปยังไดเรกทอรีปัจจุบัน:

$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images

และเพื่อ จำกัด จำนวนไดเรกทอรีย่อยคุณสามารถตั้งค่าระดับสูงสุดของไดเรกทอรีย่อยด้วย-L levelเช่น:

$ tree -dfi -L 1 "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images

สามารถดูข้อโต้แย้งเพิ่มเติมได้ ต้นไม้มนุษย์


15

ในกรณีที่คุณสงสัยว่าเหตุใดผลลัพธ์จาก 'ls -d * /' ให้เครื่องหมายสแลชสองอันให้คุณเห็นเช่น:

[prompt]$ ls -d */    
app//  cgi-bin//  lib//        pub//

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

เพื่อกำจัดปัญหานี้แน่นอนคุณสามารถกำหนดนามแฝงที่แตกต่างกันสำหรับ ls อย่างไรก็ตามเพื่อไม่ให้เรียกใช้นามแฝงชั่วคราวคุณสามารถเพิ่มคำสั่งล่วงหน้าด้วยแบ็กสแลช:

\ ls -d * /


11

ฉันเพิ่งเพิ่มลงใน.bashrcไฟล์ของฉัน(คุณยังสามารถพิมพ์ลงบนบรรทัดคำสั่งหากคุณต้องการ / ต้องการเพียงหนึ่งเซสชัน)

alias lsd='ls -ld */'

จากนั้น lsd จะสร้างผลลัพธ์ที่ต้องการ


คุณใช้ไม่ได้เหรอ ls -l path | grep dr
jrobertsz66

5
"จากนั้น lsd จะสร้างผลลัพธ์ที่ต้องการ" ฉันหัวเราะ
fbafelipe

1
จากประสบการณ์ของฉันมันสร้างผลลัพธ์
ทอดด์

ฉันใช้ 'หนุ่ม' (รายการไดเรกทอรีทั้งหมด) และฉันยังรวม '. * /' เพื่อรวมไดเรกทอรีที่ซ่อนอยู่ด้วย แน่นอนว่าการเสียดสีไม่ได้หายไปกับฉันเช่นกัน
DryLabRebel

11

lsทางออกที่แท้จริงรวมถึง symlink ไปยังไดเรกทอรี

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

ไม่รวม symlink

lsมีการให้โซลูชันหนึ่งที่ใช้แต่ทำสิ่งที่แตกต่างจากโซลูชันอื่น ๆ โดยที่ไม่รวม symlinkไปยังไดเรกทอรี:

ls -l | grep '^d'

(อาจเป็นไปได้ว่าผ่านsedหรือawkแยกชื่อไฟล์)

รวมถึง symlink

ในกรณี (อาจพบได้บ่อยกว่า) ที่ควรรวม symlink ไปยังไดเรกทอรีเราสามารถใช้-pตัวเลือกlsซึ่งทำให้ผนวกอักขระเครื่องหมายทับลงในชื่อของไดเรกทอรี (รวมถึง symlinked):

ls -1p | grep '/$'

หรือกำจัดเครื่องหมายทับต่อท้าย:

ls -1p | grep '/$' | sed 's/\/$//'

เราสามารถเพิ่มตัวเลือกได้lsตามต้องการ (ถ้าใช้รายชื่อยาว ๆ-1ก็ไม่จำเป็นต้องใช้อีกต่อไป)

หมายเหตุ:หากเราต้องการเครื่องหมายสแลช แต่ไม่ต้องการให้เน้นโดยgrepเราสามารถแฮ็คไฮไลต์โดยการทำให้ส่วนที่ตรงกันของบรรทัดว่างเปล่า:

ls -1p | grep -P '(?=/$)'

9

หากไม่จำเป็นต้องมีไดเรกทอรีที่ซ่อนอยู่ในรายการฉันขอเสนอ:

ls -l | grep "^d" | awk -F" " '{print $9}'  

และหากจำเป็นต้องระบุไดเรกทอรีที่ซ่อนอยู่ให้ใช้:

ls -Al | grep "^d" | awk -F" " '{print $9}'

หรือ

find -maxdepth 1 -type d | awk -F"./" '{print $2}'

หากคุณต้องการทราบข้อมูลเพิ่มเติมawkโปรดดูคำตอบ
ผู้เรียน PHP

เมื่อเทียบกับคำตอบอื่น ๆ ตัวเลือกแรกของ "ls .. | grep ... | awk" ดูเหมือนว่าสคริปต์มากเกินไป
Lars Nordin

1
คุณกำลังสมมติว่าไม่มีไดเรกทอรีใดที่มีช่องว่างในชื่อ
Benjamin R

7

เพื่อแสดงรายการโฟลเดอร์ที่ไม่มี /

ls -d */|sed 's|[/]||g'

2
หรือls -d1 */ | tr -d "/"
ccpizza

ไม่จำเป็นต้องเรียกคำสั่งภายนอก:set -- */; printf "%s\n" "${@%/}"

ฉันชอบวิธีการของ @wholanda โซลูชันที่สั้นกว่าของฉันคือ (ผ่านการทดสอบและทำงาน): ls -d * / | sed 's | / || g'
klor

การมีชื่อแทน lsdir ก็มีประโยชน์เช่นกัน: alias lsdirs = "ls -d * / | sed 's | / || g'"
klor

6

นี่คือสิ่งที่ฉันใช้

ls -d1 /Directory/Path/*;


นี่เป็นทางออกที่ดีที่จะแสดงทีละบรรทัด
Nikolay Frick

มันจะไม่แสดงรายการไดเรกทอรีเท่านั้น คุณต้องเพิ่มเครื่องหมายทับ:ls -d1 /Directory/Path/*/
Skippy le Grand Gourou

6

สำหรับรายการไดเรกทอรีเท่านั้น:

ls -l | grep ^d

สำหรับรายการไฟล์เท่านั้น:

ls -l | grep -v ^d 

หรือคุณสามารถทำเช่น: ls -ld * /


4

ทดสอบว่ารายการนั้นเป็นไดเรกทอรีด้วยtest -d:

for i in $(ls); do test -d $i && echo $i ; done

1
โปรดอธิบายว่ารหัสนี้ทำอะไรและเกี่ยวข้องกับคำถามอย่างไร
Ken YN

1
มันรันคำสั่ง teh 'ls' จากนั้นจะวนลูปผ่านเอาท์พุทการทดสอบถ้าแต่ละรายการเป็นได
เร็ก

3

*/ เป็นรูปแบบการจับคู่ชื่อไฟล์ที่ตรงกับไดเรกทอรีในไดเรกทอรีปัจจุบัน

เพื่อแสดงรายการไดเรกทอรีเท่านั้นฉันชอบฟังก์ชั่นนี้

# long list only directories
llod () { 
  ls -l --color=always "$@" | grep --color=never '^d'
}

วางไว้ใน. bashrc ของคุณ

ตัวอย่างการใช้งาน:

llod       # long listing of all directories in current directory
llod -tr   # same but in chronological order oldest first
llod -d a* # limit to directories beginning with letter 'a'
llod -d .* # limit to hidden directories

หมายเหตุ: มันจะแตกถ้าคุณใช้-iตัวเลือก นี่คือการแก้ไขสำหรับการที่:

# long list only directories
llod () { 
  ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}

3

หากคุณต้องการพิมพ์ไฟล์ทั้งหมดในหลายบรรทัดคุณสามารถเลือกls -1ที่จะพิมพ์ไฟล์แต่ละไฟล์ในบรรทัดแยกกัน file1 file2 file3


3

รายการธรรมดาของไดเรกทอรีปัจจุบันมันจะเป็น:

ls -1d ./*/

คุณต้องการจัดเรียงและทำความสะอาดหรือไม่

ls -1d ./*/ | cut -c 3- | rev | cut -c 2- | rev | sort

ข้อควรจำ:อักขระตัวพิมพ์ใหญ่มีพฤติกรรมแตกต่างกันในการจัดเรียง



2

ซับในหนึ่งรายการไดเรกทอรีเฉพาะจาก "ที่นี่"

ด้วยการนับไฟล์

for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done

2

ฉันแก้ไขบางส่วนด้วย:

cd "/path/to/pricipal/folder"

for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done

ln: «/home/inukaze/./.»: can't overwrite a directory
ln: «/home/inukaze/../..»: can't overwrite a directory
ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels

ทีนี้นี่ลดให้ฉันส่วนนายกเทศมนตรี :)


2

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

for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done

เอาท์พุท:

/pathto/parent/folder/childfolder1/
/pathto/parent/folder/childfolder2/
/pathto/parent/folder/childfolder3/
/pathto/parent/folder/childfolder4/
/pathto/parent/folder/childfolder5/
/pathto/parent/folder/childfolder6/
/pathto/parent/folder/childfolder7/
/pathto/parent/folder/childfolder8/


1

นี่คือสิ่งที่ฉันใช้สำหรับรายการเฉพาะชื่อไดเรกทอรี:

ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"

1

เพื่อตอบคำถามเดิม*/ไม่มีอะไรเกี่ยวข้องกับls; มันทำโดย shell / Bash ในกระบวนการที่เรียกว่าglobbing globbing

นี่คือเหตุผลecho */และls -d */ส่งออกองค์ประกอบเดียวกัน ( -dแฟล็กทำให้lsเอาต์พุตชื่อไดเร็กทอรีและไม่ใช่เนื้อหาของไดเร็กทอรี)


1

นี่คือรูปแบบโดยใช้แผนผังซึ่งแสดงชื่อไดเรกทอรีเฉพาะบนบรรทัดที่แยกต่างหากใช่มันน่าเกลียด แต่ก็ใช้ได้

tree -d | grep -E '^[├|└]' | cut -d ' ' -f2

หรือด้วย awk

tree -d | grep -E '^[├|└]' | awk '{print $2}'

สิ่งนี้น่าจะดีกว่าและจะยังคงอยู่/หลังจากชื่อไดเรกทอรี

ls -l | grep "^d" | awk '{print $9}'

ดูเหมือนว่าเกาหลี!
Paschalis

0
file *|grep directory

O / P (บนเครื่องของฉัน) -

[root@rhel6 ~]# file *|grep directory
mongo-example-master:    directory
nostarch:                directory
scriptzz:                directory
splunk:                  directory
testdir:                 directory

เอาต์พุตข้างต้นสามารถขัดเกลาได้มากขึ้นโดยใช้การตัด

file *|grep directory|cut -d':' -f1
mongo-example-master
nostarch
scriptzz
splunk
testdir

* could be replaced with any path that's permitted
 file - determine file type
 grep - searches for string named directory
 -d - to specify a field delimiter
 -f1 - denotes field 1

0

คำสั่งที่สั้นที่สุดที่เคยมี (แฮ็คจริง ๆ ) สำหรับรายการไดเรกทอรีเท่านั้น พิมพ์เส้นทางสัมบูรณ์หรือเส้นทางสัมพัทธ์ของไดเรกทอรีที่สนใจแล้วกด Enter เพื่อเข้าสู่ไดเรกทอรีที่สนใจ ตอนนี้พิมพ์cdและกดคีย์แท็บ แสดงเฉพาะไดเรกทอรีเท่านั้น

user@ubuntu:~/Desktop$cd <tab key>

คำสั่งดังกล่าวในขณะนี้ควรจะแสดงโฟลเดอร์เฉพาะในสก์ท็อป สั้นที่สุดแน่นอน


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

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