Score:-4

วิธีนับโฟลเดอร์และโฟลเดอร์ย่อยทั้งหมดในไดเร็กทอรีแบบเรียกซ้ำ

ธง in

งานคือ: เอาต์พุตเมื่อรันไฟล์จะเป็นจำนวนไดเร็กทอรีย่อย (นับไดเร็กทอรีย่อยทั้งหมดในทรี) ในไดเร็กทอรีที่ป้อน.

ฉันรู้วิธีเรียกใช้ dir แบบเรียกซ้ำ -ร แต่ฉันจะนับจำนวนเหล่านี้ในไฟล์เชลล์สคริปต์ได้อย่างไร

us flag
นี่เป็นการบ้านหรือเปล่า
in flag
ใช่ มันเป็นการบ้าน และฉันค้นหาในอินเทอร์เน็ตแต่ไม่พบอะไรเลย :(
Score:4
ธง hr

เพื่อนับไดเร็กทอรีทั้งหมด รวมถึงสิ่งที่ซ่อนอยู่ ในต้นไม้ที่หยั่งรากที่ไดเร็กทอรีปัจจุบัน . ทั้ง

หา . -พิมพ์ d -printf '\n' | สุขา -l

หรือ

หา . -พิมพ์ d -พิมพ์f x | สุขา - ค

(คุณสามารถแทนที่อักขระใด ๆ แทน x: หากคุณเลือกอักขระพิเศษสำหรับเชลล์ อย่าลืมใส่เครื่องหมายอัญประกาศหรือหลีกอักขระนั้น) โดยใช้ พิมพ์f '\n' | สุขา -l หรือ พิมพ์f x | สุขา - ค แทนที่จะส่งรายชื่อไฟล์ไปให้ สุขา -l จะทำให้การนับถูกต้องแม้ว่าจะมีไดเร็กทอรีที่มีชื่อก็ตาม บรรจุ ขึ้นบรรทัดใหม่

คำสั่งทั้งสองรวมถึงไดเร็กทอรีเริ่มต้น . ในการนับ - หากคุณต้องการนับอย่างเคร่งครัด ย่อยไดเรกทอรีแล้วลบ 1 หรือเพิ่ม - ความลึกขั้นต่ำ 1

หา . -ความลึกขั้นต่ำ 1 -type d -printf '\n' | สุขา -l

หรือใช้ ! -ชื่อ . เพื่อไม่รวม . ไดเร็กทอรีอย่างชัดเจน

หากคุณต้องการยกเว้นไดเร็กทอรีที่ซ่อนอยู่ (รวมถึงที่เป็นไปได้ ไม่ใช่- ไดเร็กทอรีย่อยที่ซ่อนอยู่ของไดเร็กทอรีที่ซ่อนอยู่) จากนั้น พรุน อดีตพวกเขา

ค้นหา -minเชิงลึก 1 -type d \( -name '.*' -prune -o -printf x \) | สุขา - ค

อีกวิธีหนึ่งคือใช้การหมุนซ้ำของเชลล์เพื่อสำรวจต้นไม้ ใช้ zsh เช่น

dirs=( **/(ND/) )
พิมพ์ $#dirs

ที่ไหน (ND/) เป็น รอบคัดเลือกระดับโลก ที่ทำให้ **/ จับคู่ไดเร็กทอรีเท่านั้นและรวมที่ซ่อนอยู่ ("ot") อัน - ละเว้น the หากคุณต้องการนับเฉพาะไดเร็กทอรีที่ไม่ซ่อนอยู่

คุณสามารถทำสิ่งที่คล้ายกันใน bash:

shopt -s nullglob dotglob globstar
ตั้ง -f -- **/
พิมพ์f '%d\n' "$#"

แต่ไม่เหมือนกับของ zsh / รอบคัดเลือก, the **/ รูปแบบลูกโลกจะจับคู่ทุกอย่างที่ดูเหมือนไดเร็กทอรี รวมถึงลิงก์สัญลักษณ์ไปยังไดเร็กทอรี

in flag
ขอบคุณมากสำหรับคำตอบของคุณ
hr flag
@bac0n ขอบคุณ - เพิ่ม (และอัปเดตส่วนอื่น ๆ ด้วย -minความลึกเพื่อความสอดคล้อง)
Score:1
ธง cn

ลองวิ่ง ls -l -R | grep -c ^d ในเทอร์มินัลของคุณจากไดเร็กทอรีที่คุณต้องการทราบว่ามีกี่รายการอยู่ภายใน

*** แก้ไข *** ใช้ด้านล่างเพื่อสแกนด้วยเส้นทางตัวแปรที่แจ้งให้ผู้ใช้ทราบ

#!/bin/bash
echo "กรุณาระบุเส้นทางที่จะสแกน:"
อ่านเส้นทาง
ls -l -R $เส้นทาง | grep -c ^d
in flag
นั่นคือสิ่งที่ฉันกำลังมองหา
in flag
แต่ฉันจะกำหนดเส้นทางที่กำหนดเองไปยังโฟลเดอร์ได้อย่างไร
Roxana avatar
cn flag
คุณสามารถเพิ่มเส้นทางคำสั่งเช่น ```ls -l -R /usr/share/themes | grep -c ^d ```. คุณสามารถเพิ่มตัวแปรเช่น ```ls -l -R $path | grep -c ^d``` และมี $path เป็นอินพุตตัวแปรให้กับสคริปต์ของคุณ
in flag
ขอบคุณมาก
sourav c. avatar
cn flag
โดยทั่วไป การแยกวิเคราะห์ผลลัพธ์ของ `ls` เป็นความคิดที่ไม่ดี ฉันจะไม่ให้กำลังใจใคร ดู https://unix.stackexchange.com/questions/128985/why-not-parse-ls-and-what-to-do-in แทน
Roxana avatar
cn flag
ฉันแก้ไขคำตอบด้านบนเพื่อแสดงตัวแปร Sourav ไม่ผิดที่จะหลีกเลี่ยงการแยกวิเคราะห์ LS แต่เนื่องจากคุณไม่ได้มองหาชื่อไฟล์ แทนที่จะนับโฟลเดอร์ จึงไม่สำคัญ เป็นวิธีแก้ปัญหาที่ง่ายและสะอาด
bac0n avatar
cn flag
@Roxanna จะยังคงมีปัญหา เชื่อว่าโหมดไม่โต้ตอบใช้ตัวอักษรเป็นรูปแบบการอ้างอิง ซึ่งหมายความว่า เช่น `'folder'$'\n''d'` จะให้ค่าบวกที่ผิดพลาด ลองคิดดู *quoting style* อื่นๆ จะทำ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา