คำนวณขนาดไฟล์เฉลี่ย


11

ฉันกำลังมองหาซับในที่สะดวกสำหรับการคำนวณขนาดไฟล์เฉลี่ยในไดเรกทอรี

สิ่งที่ฉันต้องการคือ:

ขนาดของไฟล์ทั้งหมด / จำนวนไฟล์ในไดเรกทอรี


เช่นเดียวกับขนาดเฉลี่ยของแต่ละไฟล์ในไดเรกทอรี? หรือขนาดของไดเรกทอรี?
Drake Clarris

ขนาดเฉลี่ยของไฟล์ในไดเรกทอรี
taffer

คำตอบ:


3

ด้วย FreeBSD / Mac OS X find, statและawk(ไม่ได้ว่ามีประโยชน์หนึ่งซับแม้ว่า):

find -x . -type f -maxdepth 1 -exec sh -c 'stat -f '%z' "${@}"' _ '{}' + | 
LC_ALL=C awk -v pwd="${PWD}" '
   BEGIN{ sum=0; count=0; }
   { sum+=$1; ++count; }
   END{ 
        if (count == 0) exit;
        printf ("number of files: %d\n", count); 
        printf ("average file size in B: %.5f\n", sum/count); 
        printf ("average file size in KB: %.5f\n", (sum/count) / 1024); 
        printf ("average file size in MB: %.5f\n", (sum/count) / (1024*1024)); 
        printf ("directory: %s\n", pwd); 
   }
'

ทราบว่าใน-v var=value, awkจะขยายลำดับ ANSI C รวม\n, \r... ในขณะที่เปลือกหอยจะส่งออกPWDเพื่อให้คุณสามารถใช้ENVIRON["PWD"]ในawkซึ่งไม่ได้มีชนิดของปัญหาที่สำหรับไดเรกทอรีที่มีเครื่องหมายในชื่อของพวกเขา
Stéphane Chazelas

find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'หากคุณเพียงแค่ต้องขนาดเฉลี่ยไบต์คุณสามารถใช้
Lri

11

ด้วย GNU ค้นหา:

find . -type f -printf '%s\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s/NR}'

หรือสำหรับการใช้งานดิสก์:

find . -type f -printf '%k\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s*1024/NR}'

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

ด้านบนนับเฉพาะไฟล์ปกติไม่ใช่ symlink หรือไดเรกทอรีหรือไฟล์พิเศษอื่น ๆ มันมีไฟล์ที่ซ่อนอยู่

เช่นเดียวกับzshbuiltins:

zmodload -i zsh/stat
count() {zstat -Hs -- $REPLY; ((size+=$s[size], count++, 0))}
size=0 count=0
**/*(oNDN.+count)
print -f "Count: %s\nAverage size: %.2f\n" $count $(($size./count))

3

โซลูชันแบบง่ายในบรรทัดเดียว:

ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'

มันมีการโกงทางไวยากรณ์โดยพิจารณาเฉพาะlsบรรทัดเอาต์พุตที่ขึ้นต้นด้วย '-' ซึ่งควรประกอบด้วยข้อมูลสำหรับไฟล์ปกติ


2

สำหรับไฟล์ในไดเร็กทอรีเท่านั้นโดยไม่สนใจไดเร็กทอรีย่อย:

expr $(du -Ss | cut -f1) / $(find /path/to/dir -maxdepth 1 -type f | wc -l)

หรือนับไฟล์ทั้งหมดรวมถึงไฟล์ในไดเรกทอรีย่อย:

expr $(du -s | cut -f1) / $(find /path/to/dir -type f | wc -l)

ฉันไม่ต้องการเพิกเฉยไดเรกทอรีย่อย
taffer

ดี เพียงเพิ่ม -k เพื่อดูการขอร้องเพื่อให้ได้ผลลัพธ์เป็น 1024bytes (kb) แทน 512bytes (ขนาดเริ่มต้นของกลุ่มไฟล์)
Olivier Dulac

2
du -sจะเพิ่มการใช้งานดิสก์ (ไม่ใช่ขนาด) ของไฟล์และไดเรกทอรีทั้งหมดและไฟล์อื่น ๆ ที่ไม่ใช่ไฟล์ปกติยกเว้นลิงค์ยากพิเศษไปยังไฟล์เดียวกันในขณะที่findจะนับไฟล์ปกติทั้งหมด นอกจากนี้ชื่อไฟล์ที่มีอักขระขึ้นบรรทัดใหม่จะถูกนับหลายครั้ง du -Sเฉพาะ GNU du -sจะรายงานส่วนหรือกิโลไบต์ขึ้นอยู่กับระบบปฏิบัติการ
Stéphane Chazelas

ตามปกติ @StephaneChazelas ความรู้เกี่ยวกับ linux / unix ทำให้ฉันประหลาดใจและแสดงให้ฉันเห็นว่าการแก้ปัญหาที่รวดเร็วและสกปรกของฉันนั้นสกปรกเพียงใด คุณใช้ linux / unix มานานเท่าไหร่แล้ว
Drake Clarris

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