du ซึ่งนับจำนวนไฟล์ / ไดเรกทอรีมากกว่าขนาด


13

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

มีวิธีที่ฉันสามารถทำสิ่งที่ชอบduแต่ไม่นับขนาดไฟล์ แต่แทนที่จะเป็นจำนวนไฟล์และไดเรกทอรี? ตัวอย่างเช่น: ไฟล์คือ 1 และไดเรกทอรีคือจำนวนไฟล์ / ไดเรกทอรีซ้ำภายใน + 1

แก้ไข:ฉันควรชัดเจนยิ่งขึ้น ฉันไม่เพียง แต่ต้องการทราบจำนวนไฟล์ / ไดเร็กตอรี่ทั้งหมด/, แต่ใน/home, /usrฯลฯ , และในไดเรกทอรีย่อย, เรียกซ้ำ, เช่นเดียวduกับขนาด


2
คิดว่าคุณอาจกำลังมองหาคำตอบที่แก้ไขได้เล็กน้อยที่นี่superuser.com/questions/198817//
James

คำตอบ:


11

ฉันพบว่า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 ที่มี


1
นี่ดูเหมือนสิ่งที่ฉันต้องการมากกว่าคำตอบที่ยอมรับ
Sridhar Sarnobat

8

วิธีที่ง่ายที่สุดดูเหมือนจะเป็น find /path/to/search -ls | wc -l

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

หากคุณเพียงแค่ใช้find /path/to/search -lsส่วนมันจะพิมพ์ไฟล์และไดเรกทอรีทั้งหมดไปที่หน้าจอของคุณ


wcคือการนับคำ -lตัวเลือกที่จะบอกว่ามันจะนับจำนวนบรรทัด

คุณสามารถใช้มันได้หลายวิธีเช่น

  • wc testfile
  • cat testfile | ห้องน้ำ

ตัวเลือกแรกให้ wc เปิดไฟล์และนับจำนวนบรรทัดคำและตัวอักษรในไฟล์นั้น ตัวเลือกที่สองทำเช่นเดียวกัน แต่ไม่มีชื่อไฟล์มันอ่านจาก stdin


คุณสามารถ combime |คำสั่งกับท่อ เอาต์พุตจากคำสั่งแรกจะถูกไพพ์ไปยังอินพุตของคำสั่งที่สอง ดังนั้นfind /path/to/search -ls | wc -lใช้ find เพื่อแสดงรายการไฟล์และไดเร็กทอรีทั้งหมดและดึงข้อมูลเอาต์พุตไปยัง wc Wc จะนับจำนวนบรรทัด

(ทางเลือกอื่นจะเป็น `ls | wc 'แต่การค้นหานั้นมีความยืดหยุ่นมากกว่าและเป็นเครื่องมือที่ดีในการเรียนรู้)


[แก้ไขหลังจากความคิดเห็น]

อาจเป็นประโยชน์ในการรวม find และ exec

เช่นfind / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;จะแสดงรายการไดเรกทอรีทั้งหมดใน / แถบบางที่คุณไม่ต้องการค้นหา เราสามารถเรียกใช้คำสั่งก่อนหน้านี้ในแต่ละไฟล์โดยให้ผลรวมของไฟล์ต่อโฟลเดอร์ใน /

อย่างไรก็ตาม:

  1. ใช้ส่วนขยายเฉพาะของ GNU -maxdepth
    มันจะทำงานบน Linux แต่จะไม่ทำงานบน unix-a-เหมือนกัน
  2. ฉันสงสัยว่าคุณอาจต้องการไฟล์จำนวนหนึ่งสำหรับแต่ละส่วนย่อย

ขออภัยไม่ใช่แค่ระดับลึก ๆ เพียงระดับเดียว แต่สำหรับทุกระดับ (นั่นคือสิ่งที่ฉันหมายถึงโดย "เรียกซ้ำ" ในการแก้ไขของฉัน)
Jesse

แทนที่จะเป็น exec echo คุณจะเรียกใช้ find | wc สำหรับแต่ละ dir ฉันรู้ว่ามันเป็นไปได้ แต่ฉันดูเหมือนจะไม่สามารถค้นพบว่าวันนี้ ฉันเดาว่าฉันทำผิดพลาดไปเรื่อย ๆ * ไปชงกาแฟ *
Hennes

4

สคริปต์ PHP ต่อไปนี้ทำการหลอกลวง

#!/usr/bin/php
<?php 

function do_scan($dir, $dev) {
  $total = 1;

  if (\filetype($dir) === 'dir' && \lstat($dir)['dev'] == $dev) {
    foreach (\scandir($dir) as $file) {
      if ($file !== '.' && $file !== '..') {
        $total += do_scan($dir . \DIRECTORY_SEPARATOR . $file, $dev);
      }
    }

    print "$total\t$dir\n";
  }

  return $total;
};

foreach (\array_slice($argv, 1) as $arg) {
  do_scan($arg, \lstat($arg)['dev']);
}

ที่ใส่ในแฟ้ม (พูด, " treesize") มันและเรียกมันด้วยchmod +x./treesize . | sort -rn | less


ทำไมคำตอบนี้ถึงได้รับการยอมรับ! คุณกำลังสมมติว่า php อยู่ในเครื่องซึ่งไม่ได้เป็นแบบนั้นเสมอไป สคริปต์ไม่ได้รับการบันทึกและเป็นข้อมูลเฉพาะ ในขณะที่มันก็โอเคที่จะตอบคำถามของคุณเองในทางทิศตะวันออก, คำตอบนี้ไม่ได้ให้คำตอบคำถามของคุณเอง ; หรือคุณไม่ได้ถามคำถามที่คุณนึกเมื่อปัญหาเกิดขึ้น ... แต่น่าเสียดายที่ฉันไม่สามารถลงคะแนนได้ฉันต้องมีจุดน้อย ... ยังคงคำตอบไม่ดี!
user1810087

ฉันไม่สามารถเขียนสคริปต์ในภาษาใด ๆโดยไม่ได้สมมติว่ามีการติดตั้งล่ามสำหรับภาษานั้น สคริปต์จะพิมพ์จำนวนไฟล์และไดเรกทอรีทั้งหมดใต้แต่ละไดเรกทอรีซ้ำ ดังนั้นduนับเพียงแค่การนับขนาดบวกซึ่งเป็นสิ่งที่คำถามเดิมถาม
Jesse

2

ncduยอดเยี่ยมสำหรับสิ่งนี้!

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

[...]
KEYS
       C   Order by number of items (press again for descending order)
[...]
       c   Toggle display of child item counts.

ตัวอย่างเช่น:

เอาต์พุต ncdu


1

ใช้ประโยชน์จากความจริงที่ว่า dirs /และไฟล์จะถูกคั่นด้วย สคริปต์นี้มีคุณสมบัติตรงตามเกณฑ์ของคุณมาก แต่ทำหน้าที่สร้างแรงบันดาลใจให้กับโซลูชันเต็ม คุณควรพิจารณาจัดทำดัชนีไฟล์ของคุณด้วยการค้นหา

geee: /R/tb/tmp
$ find  2>/dev/null | awk -F/ -f filez  | sort -n
files:  57
3       imagemagick
7       portage
10      colemak-1.0
25      minpro.com
42      monolith
80      QuadTree
117     themh
139     skyrim.stings
185     security-howto
292     ~t
329     skyrim
545     HISTORY
705     minpro.com-original
1499    transmission-2.77
23539   ugent-settings

>

$ cat filez
{
a[$2]++;     # $1= folder,  $2 = everything inside folder.
}

END {
        for (i in a) {
                if (a[i]==1) {files++;}
                else { printf "%d\t%s\n", a[i], i; }
        }
        print "files:\t" files
}

>

 $ time locate /  | awk -F/ -f /R/tb/tmp/filez  | sort -n
 files:  13
 2
 2       .fluxbox
 10      M
 11      BIN
 120     bin
 216     sbin
 234     boot
 374     R
 854     dev
 1351    lib
 2018    etc
 9274    media
 30321   opt
 56516   home
 93625   var
 222821  usr
 351367  mnt
 time: Real 0m17.4s  User 0m4.1s  System 0m3.1s

2
ทำไมฉันมี. fluxbox ใน / : D
ЯрославРахматуллин

1

นี่เป็นวิธีการแก้ปัญหาที่ใช้ทุบตีแรงบันดาลใจจากการโพสต์จาก Unix และ Linux

find . -type d | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

หากมีบางโฟลเดอร์ที่คุณไม่ต้องการที่จะดูรายละเอียดของเช่นคุณสามารถแยกพวกเขาออกจากรายการที่มี.gitgrep

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.