คำสั่งนี้จะแสดงรายการไดเรกทอรีในเส้นทางปัจจุบัน: ls -d */
รูปแบบที่แน่นอน*/
ทำอะไร?
และเราจะให้เส้นทางแบบสัมบูรณ์ในคำสั่งด้านบน (เช่นls -d /home/alice/Documents
) เพื่อแสดงรายการเฉพาะไดเรกทอรีในเส้นทางนั้นได้อย่างไร
คำสั่งนี้จะแสดงรายการไดเรกทอรีในเส้นทางปัจจุบัน: ls -d */
รูปแบบที่แน่นอน*/
ทำอะไร?
และเราจะให้เส้นทางแบบสัมบูรณ์ในคำสั่งด้านบน (เช่นls -d /home/alice/Documents
) เพื่อแสดงรายการเฉพาะไดเรกทอรีในเส้นทางนั้นได้อย่างไร
คำตอบ:
*/
เป็นรูปแบบที่ตรงกับไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีปัจจุบัน ( *
จะตรงกับไฟล์และไดเรกทอรีย่อยทั้งหมดนั้น/
จะ จำกัด เฉพาะไดเรกทอรี) ในทำนองเดียวกันเมื่อต้องการแสดงรายการไดเรกทอรีย่อยทั้งหมดภายใต้ / home / alice / Documents ให้ใช้ls -d /home/alice/Documents/*/
*/
จะไม่ตรงกับโฟลเดอร์ใด ๆ ที่ซ่อนอยู่ หากต้องการรวมพวกเขาระบุพวกเขาชอบอย่างชัดเจนls -d .*/ */
หรือตั้งค่าdotglob
ตัวเลือกใน Bash
ls
กับสิ่งที่ไม่มีอยู่
ls */
จะขยายเป็นเพียงls
ซึ่งจะแสดงรายการไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน ฉันค่อนข้างแน่ใจว่านั่นไม่ใช่สิ่งที่คุณต้องการในกรณีนี้
echo
ตัวอย่าง: echo */
, echo */*/
นี่คือสิ่งที่ผมได้รับ:
cs/ draft/ files/ hacks/ masters/ static/
cs/code/ files/images/ static/images/ static/stylesheets/
ls
เท่านั้นตัวอย่าง: ls -d */
นี่คือสิ่งที่ฉันได้รับ:
cs/ files/ masters/
draft/ hacks/ static/
หรือเป็นรายการ (พร้อมข้อมูลรายละเอียด): ls -dl */
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
ตัวอย่าง: 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/
3
ช้ากว่าคนอื่นอย่างเห็นได้ชัดสำหรับฉัน ในไดเรกทอรีฉันทดสอบ: 1
.012s, 2
.016s, 3
.055s , 4
.021s
1
เป็นที่ชื่นชอบ
time
ฟังก์ชัน Unix แล้ว /// ฉันยอมรับคือฉลาดกว่าecho */
ls -d */
1.
ตัวเลือกที่จะทำให้เกิดการปวดที่สำคัญเมื่อต้องรับมือกับชื่อโฟลเดอร์ที่มีช่องว่าง
ฉันใช้:
ls -d */ | cut -f1 -d'/'
สิ่งนี้สร้างคอลัมน์เดี่ยวที่ไม่มีเครื่องหมายสแลชต่อท้าย - มีประโยชน์ในสคริปต์
สองเซ็นต์ของฉัน
-1
ตัวเลือกสำหรับการส่งออกจะอยู่ในรูปแบบคอลัมน์เดียวเช่นกันในขณะที่ls
ls -1 -d */
-1
ยังคงส่งออกเครื่องหมายทับต่อท้ายสำหรับทุกรายการ
.bashrc
เป็นนามแฝงฉันจะเพิ่มได้'/'
อย่างไร
'\/'
| sed -e 's-/$--'
สำหรับโฟลเดอร์ทั้งหมดที่ไม่มีโฟลเดอร์ย่อย:
find /home/alice/Documents -maxdepth 1 -type d
สำหรับโฟลเดอร์ทั้งหมดที่มีโฟลเดอร์ย่อย:
find /home/alice/Documents -type d
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
มิฉะนั้นคุณจะต้องรวม/home/alice/Documents
ตัวมันเอง หากต้องการรวมลิงก์ไปยังไดเรกทอรีให้นำหน้าด้วย-L
unquotedดอกจัน*
จะถูกตีความว่าเป็นรูปแบบ (glob) โดยเปลือก
เชลล์จะใช้มันในการขยายชื่อพา ธ
จากนั้นจะสร้างรายการชื่อไฟล์ที่ตรงกับรูปแบบ
เครื่องหมายดอกจันแบบง่ายจะตรงกับชื่อไฟล์ทั้งหมดใน PWD (ไดเรกทอรีทำงานปัจจุบัน)
รูปแบบที่ซับซ้อนยิ่งขึ้นซึ่ง*/
จะตรงกับชื่อไฟล์ทั้งหมดที่ลงท้าย/
ด้วย
ดังนั้นไดเรกทอรีทั้งหมด นั่นคือเหตุผลที่คำสั่ง:
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 */
อย่างไรก็ตามคำสั่งนี้ค่อนข้างเชื่อถือได้น้อยกว่า มันจะล้มเหลวด้วยไฟล์ที่มีชื่อแปลก ๆ ที่ระบุไว้ข้างต้น มันจะทำให้หายใจไม่ออกด้วยหลายชื่อ คุณต้องลบทีละตัวจนกว่าคุณจะพบคนที่มีปัญหา
GNU ls
จะยอมรับปุ่ม "end of options" ( --
)
ls -d ./*/ ### more reliable BSD ls
ls -d -- */ ### more reliable GNU ls
ในการแสดงรายการแต่ละไดเรกทอรีในบรรทัดของตนเอง (ในหนึ่งคอลัมน์คล้ายกับ 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
)ในที่สุดการใช้รายการอาร์กิวเมนต์ภายในฟังก์ชันจะไม่ส่งผลกระทบต่อรายการอาร์กิวเมนต์ของเชลล์ที่กำลังรันอยู่ เพียง:
$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs
นำเสนอรายการนี้:
--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var
ตัวเลือกนี้ปลอดภัยด้วยชื่อไฟล์แปลก ๆ หลายประเภท
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
สามารถดูข้อโต้แย้งเพิ่มเติมได้ ต้นไม้มนุษย์
ในกรณีที่คุณสงสัยว่าเหตุใดผลลัพธ์จาก 'ls -d * /' ให้เครื่องหมายสแลชสองอันให้คุณเห็นเช่น:
[prompt]$ ls -d */
app// cgi-bin// lib// pub//
อาจเป็นเพราะไฟล์เชลล์หรือเซสชั่นการกำหนดค่าของคุณบางแห่งใช้นามแฝงคำสั่ง ls เป็นเวอร์ชันของ ls ที่มีแฟล็ก -F การตั้งค่าสถานะนั้นจะผนวกอักขระแต่ละชื่อเอาท์พุท (ไม่ใช่ไฟล์ธรรมดา) เพื่อระบุประเภทของมัน ดังนั้นหนึ่งเครื่องหมายทับคือจากการจับคู่รูปแบบ '* /' และเครื่องหมายทับอีกอันคือตัวบ่งชี้ชนิดต่อท้าย
เพื่อกำจัดปัญหานี้แน่นอนคุณสามารถกำหนดนามแฝงที่แตกต่างกันสำหรับ ls อย่างไรก็ตามเพื่อไม่ให้เรียกใช้นามแฝงชั่วคราวคุณสามารถเพิ่มคำสั่งล่วงหน้าด้วยแบ็กสแลช:
\ ls -d * /
ฉันเพิ่งเพิ่มลงใน.bashrc
ไฟล์ของฉัน(คุณยังสามารถพิมพ์ลงบนบรรทัดคำสั่งหากคุณต้องการ / ต้องการเพียงหนึ่งเซสชัน)
alias lsd='ls -ld */'
จากนั้น lsd จะสร้างผลลัพธ์ที่ต้องการ
ls
ทางออกที่แท้จริงรวมถึง symlink ไปยังไดเรกทอรีคำตอบมากมายที่นี่ไม่ได้ใช้จริง ๆls
(หรือใช้ในความหมายเล็กน้อยls -d
เท่านั้นในขณะที่ใช้สัญลักษณ์แทนสำหรับการจับคู่ไดเรกทอรีย่อยที่แท้จริงls
โซลูชันที่แท้จริงมีประโยชน์เนื่องจากช่วยให้สามารถใช้ls
ตัวเลือกสำหรับการเรียงลำดับเป็นต้น
ls
มีการให้โซลูชันหนึ่งที่ใช้แต่ทำสิ่งที่แตกต่างจากโซลูชันอื่น ๆ โดยที่ไม่รวม symlinkไปยังไดเรกทอรี:
ls -l | grep '^d'
(อาจเป็นไปได้ว่าผ่านsed
หรือawk
แยกชื่อไฟล์)
ในกรณี (อาจพบได้บ่อยกว่า) ที่ควรรวม symlink ไปยังไดเรกทอรีเราสามารถใช้-p
ตัวเลือกls
ซึ่งทำให้ผนวกอักขระเครื่องหมายทับลงในชื่อของไดเรกทอรี (รวมถึง symlinked):
ls -1p | grep '/$'
หรือกำจัดเครื่องหมายทับต่อท้าย:
ls -1p | grep '/$' | sed 's/\/$//'
เราสามารถเพิ่มตัวเลือกได้ls
ตามต้องการ (ถ้าใช้รายชื่อยาว ๆ-1
ก็ไม่จำเป็นต้องใช้อีกต่อไป)
หมายเหตุ:หากเราต้องการเครื่องหมายสแลช แต่ไม่ต้องการให้เน้นโดยgrep
เราสามารถแฮ็คไฮไลต์โดยการทำให้ส่วนที่ตรงกันของบรรทัดว่างเปล่า:
ls -1p | grep -P '(?=/$)'
หากไม่จำเป็นต้องมีไดเรกทอรีที่ซ่อนอยู่ในรายการฉันขอเสนอ:
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
โปรดดูคำตอบ
เพื่อแสดงรายการโฟลเดอร์ที่ไม่มี /
ls -d */|sed 's|[/]||g'
ls -d1 */ | tr -d "/"
นี่คือสิ่งที่ฉันใช้
ls -d1 /Directory/Path/*;
ls -d1 /Directory/Path/*/
สำหรับรายการไดเรกทอรีเท่านั้น:
ls -l | grep ^d
สำหรับรายการไฟล์เท่านั้น:
ls -l | grep -v ^d
หรือคุณสามารถทำเช่น: ls -ld * /
*/
เป็นรูปแบบการจับคู่ชื่อไฟล์ที่ตรงกับไดเรกทอรีในไดเรกทอรีปัจจุบัน
เพื่อแสดงรายการไดเรกทอรีเท่านั้นฉันชอบฟังก์ชั่นนี้
# 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'
}
หากคุณต้องการพิมพ์ไฟล์ทั้งหมดในหลายบรรทัดคุณสามารถเลือกls -1
ที่จะพิมพ์ไฟล์แต่ละไฟล์ในบรรทัดแยกกัน file1 file2 file3
รายการธรรมดาของไดเรกทอรีปัจจุบันมันจะเป็น:
ls -1d ./*/
คุณต้องการจัดเรียงและทำความสะอาดหรือไม่
ls -1d ./*/ | cut -c 3- | rev | cut -c 2- | rev | sort
ข้อควรจำ:อักขระตัวพิมพ์ใหญ่มีพฤติกรรมแตกต่างกันในการจัดเรียง
ลองอันนี้. ใช้งานได้กับ linux distros ทั้งหมด
ls -ltr | grep drw
ls -l | grep '^d' | awk '{print $9}'
ซับในหนึ่งรายการไดเรกทอรีเฉพาะจาก "ที่นี่"
ด้วยการนับไฟล์
for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done
ฉันแก้ไขบางส่วนด้วย:
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
ทีนี้นี่ลดให้ฉันส่วนนายกเทศมนตรี :)
การเพิ่มเพื่อทำให้เป็นวงกลมเต็มเพื่อเรียกเส้นทางของทุก ๆ โฟลเดอร์ให้ใช้การรวมกันของคำตอบของอัลเบิร์ตและ 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/
ใช้ Perl:
ls | perl -nle 'print if -d;'
นี่คือสิ่งที่ฉันใช้สำหรับรายการเฉพาะชื่อไดเรกทอรี:
ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"
เพื่อตอบคำถามเดิม*/
ไม่มีอะไรเกี่ยวข้องกับls
; มันทำโดย shell / Bash ในกระบวนการที่เรียกว่าglobbing globbing
นี่คือเหตุผลecho */
และls -d */
ส่งออกองค์ประกอบเดียวกัน ( -d
แฟล็กทำให้ls
เอาต์พุตชื่อไดเร็กทอรีและไม่ใช่เนื้อหาของไดเร็กทอรี)
นี่คือรูปแบบโดยใช้แผนผังซึ่งแสดงชื่อไดเรกทอรีเฉพาะบนบรรทัดที่แยกต่างหากใช่มันน่าเกลียด แต่ก็ใช้ได้
tree -d | grep -E '^[├|└]' | cut -d ' ' -f2
หรือด้วย awk
tree -d | grep -E '^[├|└]' | awk '{print $2}'
สิ่งนี้น่าจะดีกว่าและจะยังคงอยู่/
หลังจากชื่อไดเรกทอรี
ls -l | grep "^d" | awk '{print $9}'
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
คำสั่งที่สั้นที่สุดที่เคยมี (แฮ็คจริง ๆ ) สำหรับรายการไดเรกทอรีเท่านั้น พิมพ์เส้นทางสัมบูรณ์หรือเส้นทางสัมพัทธ์ของไดเรกทอรีที่สนใจแล้วกด Enter เพื่อเข้าสู่ไดเรกทอรีที่สนใจ ตอนนี้พิมพ์cd
และกดคีย์แท็บ แสดงเฉพาะไดเรกทอรีเท่านั้น
user@ubuntu:~/Desktop$cd <tab key>
คำสั่งดังกล่าวในขณะนี้ควรจะแสดงโฟลเดอร์เฉพาะในสก์ท็อป สั้นที่สุดแน่นอน
-d
ถึงความหมายที่แท้จริง