ฉันจะนับจำนวนโฟลเดอร์ในไดรฟ์ที่ใช้ Linux ได้อย่างไร


24

ฉันต้องจัดระเบียบฮาร์ดดิสก์ภายนอกเพื่อให้มีโฟลเดอร์ไม่เกิน 500 โฟลเดอร์ บานหน้าต่าง "Properties" ของ Ubuntu แสดงเฉพาะจำนวนไฟล์ไม่ใช่จำนวนโฟลเดอร์

มีบรรทัดคำสั่งง่ายๆที่จะบอกจำนวนไดเรกทอรีย่อยหรือไม่

ฉันจำเป็นต้องนับซ้ำและไดรฟ์เป็น HDD /media/MUSIC/ภายนอกที่ติดตั้งที่ มันเป็นระบบสเตอริโอในรถยนต์ที่มีเอกสารบอกว่าอ่านได้เพียง 500 โฟลเดอร์แรกเท่านั้น

คำตอบ:


20

นำทางไปยังไดรฟ์ของคุณและดำเนินการอย่างง่ายดาย

ls -lR | grep ^d | wc -l

ดูเหมือนว่าจะให้หมายเลขที่ถูกต้องมากกว่าคำตอบที่ฉันยอมรับเมื่อ 3 ปีที่แล้ว มันนับไดเรกทอรีที่ฉันอยู่ในขณะที่สิ่งนี้ทำไม่ได้
Dean Rather

ฉันเห็นตัวเลขต่างกันเช่นกัน แต่ไม่แตกต่างกันมากเกินไป
SPRBRN

ส่วนตัวผมชอบมากกว่าgrep -c wc -lอาจจะเป็นเพียงฉัน
Maxim_united

1
ด้านบนจะเกินจำนวนหากรายการไดเรกทอรีใด ๆ มีลำดับ\nd(โดยที่\nเป็นตัวอักษร NL)
Toby Speight

1
โทบี้เป็นสิทธิการส่งออกไม่ควรจะได้รับการประปาls ยิ่งไปกว่านี้มันจะช้ากว่ามากเพราะมันจะต้องเอาต้นไม้ทั้งหมดออกมาแล้วรัน grep ผ่านมัน
phuclv

37

ค้นหาโฟลเดอร์ทั้งหมดโดยรวมรวมถึงไดเรกทอรีย่อยใช่ไหม

find /mount/point -type d | wc -l

... หรือค้นหาโฟลเดอร์ทั้งหมดในไดเรกทอรีราก (ไม่รวมไดเรกทอรีย่อย)

find /mount/point -maxdepth 1 -type d | wc -l

อันแรกนั่นคือสิ่งที่ฉันตามมา ขอบคุณ!
Dean Rather

@Dean: ใช่ฉันเคยใช้มันเพื่อนับไดเรกทอรีในคอลเลกชันเพลงของฉันก่อนหน้านี้เช่นกัน :) สำหรับสิทธิ์ของ braggin ให้นับ MP3 ของคุณ: find / mount / point -type f | grep -i mp3 | wc -l
quack quixote

1
@Dean: ใช่ฉันไม่ทราบว่าพบไวยากรณ์เฉพาะหน้า แต่ฉันมักจะต้องการใช้grep -vที่: หา / mount / PT ประเภทฉ | grep -vi mp3 | grep -vi wav | wc -l ... (และ <i> </i> ไม่ทำงานในความคิดเห็นใช้*foo*เพื่อทำให้เป็นตัวเอียง: foo )
quack quixote

2
@Dean: ฉันคิดว่าคุณต้องการเพียงแค่ใช้find /path -not -iname '*.mp3' | wc -lเพลง MP3 กรองหรือเพื่อให้ได้ทั้ง MP3 และใช้ WAVsfind /path -not -iname '*.mp3' -not -iname '*.wav' | wc -l
นักต้มตุ๋น Quixote

1
จำเป็นต้องเพิ่ม-type fเพื่อให้ละเว้นโฟลเดอร์เช่นกัน แต่ขอแสดงความยินดี! ฉันเพิ่งพบไฟล์ m4a ทั้งกลุ่มที่ฉันไม่มีความคิดเกี่ยวกับ ... ขอบคุณ!
Dean Rather

4

บรรทัดใหม่เป็นอักขระที่ถูกต้องในชื่อไดเรกทอรี ฉันขอแนะนำให้ให้findพิมพ์บรรทัดว่างสำหรับแต่ละไดเรกทอรีที่พบแล้วปล่อยให้wcนับบรรทัดเหล่านั้น

find /mount/point -type d -printf '\n' | wc -l

3

ลองต่อไปนี้ [ดูด้านล่าง]:

ls -1 -p | grep "/" | wc -l

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

แก้ไข: คุณอาจจะไปพร้อมกับคำตอบของนักต้มตุ๋น quixote เพราะมันเป็นที่ชัดเจนมากขึ้นเล็กน้อย แต่ฉันได้แก้ไขของฉัน (หลังจากนำข้อเสนอแนะของนักต้มตุ๋นเข้าบัญชี)

ls -Rp | grep "/$" | wc -l

จำเป็นต้องเพิ่ม -R เพื่อเรียกซ้ำ (ขออภัยที่ไม่สามารถพูดถึง) และต้องระบุเส้นทางไปยัง ls แต่ใช่งานนี้: ls -1 -p -R / media / MUSIC / | grep "/" | สุขา -l ขอบคุณ!
Dean Rather

หลังจากลองทั้งสองสิ่งนี้และคำแนะนำของนักต้มตุ๋นฉันได้รับผลลัพธ์ที่แตกต่างกัน 2 รายการ ... ฉันอยากจะเชื่ออีกอย่างหนึ่ง ขอขอบคุณ!
Dean Rather

1
คุณไม่จำเป็นต้องใช้-1เนื่องจากlsจะตรวจจับไปป์และจะไม่จัดรูปแบบคอลัมน์ นอกจากนี้คุณยังสามารถคว้ารายชื่อซ้ำด้วย-Rแต่คุณอาจต้องการ grep "/$"เพียงเพื่อให้ตรงกับเครื่องหมายทับต่อท้าย (หรือจำนวนจะถูกปิด) รุ่นสุดท้าย:ls -Rp | grep "/$" | wc -l
ต้มตุ๋น quixote

1
หารุ่น i โพสต์จะนับ.(คือ/mount/point) ในการนับระบุLSรุ่นในความคิดเห็นข้างต้นของฉันจะไม่ การนับเหล่านั้นแตกต่างกัน 1 คุณสามารถใช้/mount/point/*ในคำสั่งfindเพื่อแก้ไขได้ (สมมติว่าไม่มีจุดไดเรกทอรีที่ซ่อนอยู่)
ต้มตุ๋น quixote

ฉันไม่แน่ใจว่าทำไมคุณถึงได้ผลลัพธ์ที่แตกต่างกันสองรายการ แต่วิธีการของ @ quack จะรวมไดเรกทอรี "ซ่อน" (เช่นที่ขึ้นต้นด้วย '.')
stuntmouse

1

ฉันได้เขียนffcntเพื่อเพิ่มความเร็วในการนับไฟล์แบบเรียกซ้ำภายใต้สถานการณ์ที่เฉพาะเจาะจง: ดิสก์หมุนและระบบไฟล์ที่รองรับการทำแผนที่ขอบเขต

มันสามารถเป็นลำดับความสำคัญได้เร็วกว่าlsหรือfindตามวิธีการ


1

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

วิธีที่มีประสิทธิภาพมากที่สุดในการนับไดเรกทอรีที่ฉันคิดว่าน่าจะเป็นดังต่อไปนี้เนื่องจากfindจะพิมพ์เพียงรายการเดียว.สำหรับแต่ละโฟลเดอร์ที่พบแทนเส้นทางที่สมบูรณ์และชื่อไฟล์และwcจะต้องวนซ้ำตามจำนวนอักขระเท่านั้น:

find /mount/point -type d -printf '.' |wc -c

หากต้องการแยก/mount/pointตัวเองออกจากการคำนวณและนับเฉพาะไดเรกทอรีย่อย:

find /mount/point -mindepth 1 -type d -printf '.' |wc -c

1

ฉันพบว่าdu --inodesมีประโยชน์ แต่ฉันไม่แน่ใจว่าduต้องใช้เวอร์ชันใด บน Ubuntu 17.10 ทำงานได้ดังต่อไปนี้:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

รวมกับ| sort -nrการเรียงลำดับจากมากไปน้อยตามจำนวนของ inodes ที่มี


0

ฉันชอบที่จะใช้ต้นไม้เพื่อดึงไดเรกทอรีนับด้วย

tree -d -R -fi --noreport | wc -l

หรือใช้การค้นหาเพื่อแสดงโฟลเดอร์จำนวนมากด้วย

find . -type d -printf "%h\n" | cut -d/ -f-2 | sort | uniq -c | sort -rn

หรืออะไรทำนองนี้: tree | grep -e '^. * ไดเรกทอรี,'
mindcrime

-2

เพื่อค้นหาจำนวนโฟลเดอร์และไดเรกทอรีในไดเรกทอรีปัจจุบัน

พิมพ์คำสั่งต่อไปนี้ในเทอร์มินัลของคุณ

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