ฉันจะค้นหาไฟล์และรวมขนาดไฟล์ได้อย่างไร


12

ฉันต้องการค้นหาชุดไฟล์ (ตามนิพจน์ตัวแทน) และรวมการใช้งานดิสก์ของพวกเขา

บางสิ่งเช่นนี้

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log

งานนี้. แต่มันก็ไม่ได้ให้ผลลัพธ์ที่ฉันต้องการ มันแสดงพื้นที่ที่ใช้โดยแต่ละไฟล์เช่นเดียวกับการfindวนซ้ำมัน

สิ่งที่ฉันต้องการคือผลรวมduของไฟล์ทั้งหมดที่พบ

คำตอบ:


12

สารละลาย

โดยการจัดหาตัวเลือก-c(หรือ--total) ให้du(1)คุณสามารถสั่งให้ผลิตผลรวมทั้งหมด หากการใช้งานของคุณdu(1)รองรับตัวเลือกเหล่านี้คุณสามารถบรรลุผลตามที่ต้องการโดยใช้คำสั่งต่อไปนี้:

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

แก้ไข:โปรดทราบว่าหากจำนวนไฟล์เกินจำนวนสูงสุดของพารามิเตอร์ที่ระบบของคุณอนุญาตfindอาจยังคงใช้งานได้commandหลายครั้ง การใช้งานบางส่วนของdu(1)ยังสนับสนุนการอ่านชื่อไฟล์จากไฟล์ซึ่งไม่ประสบข้อ จำกัด ดังกล่าว:

$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames

คำอธิบาย

ความแตกต่างระหว่างความหมายของ-exec command {} \;และ-exec command {} +มีดังต่อไปนี้:

  • command {} \;รันcommandหนึ่งครั้งสำหรับผลลัพธ์แต่ละfindรายการ ชื่อพา ธ {}ของผลที่ได้จะถูกส่งแทน

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
  • command {} +ดำเนินการcommandเมื่อผลลัพธ์ทั้งหมดได้รับการเรียกคืน pathnames {}ของผลที่จะถูกส่งผ่านแทน

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3

-print0ตัวเลือกที่เป็นสาเหตุของfind(1)การพิมพ์ชื่อไฟล์ที่พบในการออกมาตรฐานคั่นด้วยอักขระ null และ--files0-fromตัวเลือกที่เกิดจากdu(1)การอ่านชื่อไฟล์ null คั่น ไม่เหมือนกับอักขระขึ้นบรรทัดใหม่อักขระ null อาจไม่ปรากฏในชื่อไฟล์ดังนั้นเอาต์พุตจึงไม่คลุมเครือ

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับตัวเลือกของdu(1)และfind(1)คุณควรปรึกษา manpages ที่เกี่ยวข้อง:

$ man du
$ man find

2
คุณอาจลงท้ายด้วยผลรวมหลายรายการหากจำนวนไฟล์มีความสำคัญ (1K +) เนื่องจากจำนวนข้อ จำกัด อาร์กิวเมนต์บรรทัดคำสั่ง
ychaouche

ฉันสามารถยืนยัน @ychaouche ได้ฉันมีปัญหาในขณะที่พยายามประเมินขนาดไฟล์มากกว่า 30k
Adrien H

หากเป็นปัญหาการใช้งานของบางส่วนนอกจากนี้ยังสนับสนุนการอ่านชื่อไฟล์จากไฟล์:du(1) find 1 2 3 -maxdepth 0 -print0 > filenames; du -shc --files0-from=filenames
Witiko

4

ลองสิ่งนี้:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

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


สิ่งนี้จะไม่ให้ผลลัพธ์ที่ถูกต้องพร้อมชื่อพา ธ ที่มีช่องว่าง วิธีที่จะทำเช่นนี้คือการใช้-exec du -c {} +ตัวเลือกในการfindที่จะผ่าน pathnames duไม่เปลี่ยนแปลงไป
Witiko


2

ฉันจะfindพิมพ์ขนาดตัวเองและใช้เครื่องมืออื่นเพื่อคำนวณผลรวม:

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

หากคุณต้องการดูชื่อไฟล์:

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'

1

สายการบินหนึ่งที่ควรทำงานเพื่อให้ได้ผลรวมเป็นกิกะไบต์บนระบบส่วนใหญ่

echo "$(( ($(find . -name 'flibble*' -ctime +90 -type f -printf '%k+' )0)/1024/1024 )) GB"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.