แสดงผลรวมของขนาดไฟล์ในรายการไดเรกทอรี


71

dirคำสั่งรายชื่อไดเรคทอรี Windows มีบรรทัดที่ท้ายแสดงจำนวนพื้นที่ทั้งหมดที่ใช้โดยไฟล์ที่แสดง ตัวอย่างเช่นdir *.exeแสดง.exeไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันขนาดและผลรวมทั้งหมดของขนาด ฉันชอบที่จะมีฟังก์ชั่นที่คล้ายกันกับdirนามแฝงของฉันในทุบตี แต่ฉันไม่แน่ใจว่าจะทำอย่างไร

ขณะนี้ฉันมีalias dir='ls -FaGl'ในของฉัน.bash_profileแสดง

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

ตัวอย่างเช่น. รับคำตอบจากคำถามนี้ :

dir | awk '{ total += $4 }; END { print total }'

ซึ่งให้ฉันทั้งหมด แต่ไม่พิมพ์รายชื่อไดเรกทอรีเอง มีวิธีที่จะเปลี่ยนสิ่งนี้เป็นหนึ่งซับหรือสคริปต์เชลล์เพื่อให้ฉันสามารถผ่านlsข้อโต้แย้งใด ๆ ที่ฉันต้องการdirและได้รับรายชื่อเต็มบวกรวม? ตัวอย่างเช่นฉันต้องการเรียกใช้dir -R *.jpg *.tifเพื่อรับรายการและขนาดรวมของประเภทไฟล์เหล่านั้นในไดเรกทอรีย่อยทั้งหมด จะเป็นการดีถ้าฉันจะได้ขนาดของแต่ละไดเรกทอรีย่อย แต่สิ่งนี้ไม่จำเป็น


5
ทำไมไม่ls -lhช่วยคุณ มันพิมพ์ผลรวมทั้งหมดในด้านบน คุณยังสามารถเรียกใช้du -sh *.exeเพื่อรับข้อมูลการใช้พื้นที่ดิสก์ในรูปแบบที่มนุษย์อ่านได้
bagavadhar

@ashwin ฉันไม่รู้ว่าการพิมพ์ 'รวม' ls -lhคืออะไร แต่ก็ไม่ได้เกี่ยวข้องกับสิ่งที่awkสคริปต์ด้านล่างคำนวณหรือสิ่งที่ฉันเพิ่มด้วยมือ บางครั้งมันใกล้เคียงกับจำนวนของไฟล์ KB ในไดเรกทอรี แต่ดูเหมือนจะไม่ทำให้ขนาดของไดเรกทอรีย่อยที่จัดสรรมีผล ผมต้องการจะขอบคุณถ้าคุณสามารถชี้ให้ฉันที่มีต่อคำอธิบายของสิ่งที่ว่าตัวเลขที่เป็น ... เกิด
MattDMo

ดูว่าคำตอบของฉันด้านล่างใช้ได้กับคุณไหม
bagavadhar

1
ls -lhไม่แสดงขนาดทั้งหมดของ dir ที่คำนวณเนื้อหา
aequalsb

คำตอบ:


25

ฟังก์ชั่นต่อไปนี้ทำสิ่งที่คุณต้องการเป็นส่วนใหญ่:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

... แต่มันจะไม่ให้สิ่งที่คุณต้องการdir -R *.jpg *.tifเพราะมันไม่ls -Rทำงาน คุณอาจต้องการที่จะเล่นกับfindยูทิลิตี้สำหรับที่


1
นี่เป็นเรื่องจริงหากคุณกำลังมองหาขนาดเนื้อหาของแต่ละไฟล์เป็นหลักไม่ใช่ขนาดที่ไฟล์ใช้บนดิสก์ ความแตกต่างนี้เด่นชัดมากขึ้นสำหรับไฟล์ขนาดเล็กมาก ในดิสทริบิวเตอร์ของฉันแต่ละไฟล์จะถูกจัดสรรพื้นที่บนดิสก์เป็น 4 KB chunks (ดังนั้นไฟล์ 300 byte ยังคงใช้ 4K บนดิสก์ตามที่รายงานโดยคำสั่ง du) ระบุว่าเป็นสิ่งที่ OP กำลังมองหา "ปริมาณพื้นที่แต่ละไฟล์ใช้เวลา" แล้ว du เป็นวิธีที่จะทำ
Jon V

1
dirเป็นชื่อของ coreutil GNU ยอดนิยมอยู่แล้วฉันไม่อยากตั้งชื่อฟังก์ชั่นแบบนั้น
ของหวาน

โปรดแก้ไขเพื่อให้ทำงานได้ทั้งบน Linux และ OS-S และ "-a" รวมถึง "ของคุณ" และ ".. " ซึ่งไม่ดี:) นี่คือคำสั่งคงที่: dir () {ls -FAl "$ {@}" | awk '{total + = $ 5; พิมพ์}; END {พิมพ์ "ทั้งหมด:" ทั้งหมด} '; }
Dmitry Shevkoplyas

148

มีคำสั่ง UNIX สำหรับสิ่งนี้อยู่แล้ว: du

แค่ทำ:

du -ach 

ตามแบบแผนคุณสามารถเพิ่มไฟล์หรือพา ธ ไดเรกทอรีหนึ่งไฟล์หรือมากกว่านั้นในตอนท้ายของคำสั่ง -hเป็นส่วนขยายในการแปลงขนาดให้อยู่ในรูปแบบที่เป็นมิตรกับมนุษย์-aช่วยให้คุณมีขนาด "ชัดเจน" (ขนาดไฟล์แทนการใช้ดิสก์) และ-cให้ผลรวมในตอนท้าย


12
ใช่คุณทำงานได้ดี คุณสามารถใช้ตัวเลือก -c (เช่นเดียวกับ - ผลรวม) เพื่อรับผลรวมในตอนท้ายของรายการ
MikeB

6
โปรดทราบว่าduให้การใช้งานดิสก์ไม่ใช่ผลรวมของขนาดไฟล์
Stéphane Chazelas

7
du -hไม่รวมขนาดของไฟล์ที่ส่งไป du -h *.soแสดงขนาดของแต่ละไฟล์ แต่ไม่ใช่ขนาดรวม ฉันคิดว่าสิ่งที่คุณต้องการคือdu -hc *.so(หรือแม้แต่du -hc *.so | tail -1) แต่แน่นอนว่าเขาต้องการรายชื่อไดเรกทอรีด้วย
การชดเชย จำกัด

1
คำสั่งนี้ใช้ได้กับรายการไฟล์แบบสั้นเท่านั้น ดูว่าเกิดอะไรขึ้นเมื่อคุณมีไฟล์ 850000 ไฟล์ในไดเรกทอรี !!!
ฮามิด FzM

3
! วิธี-a --allพิจารณาให้ใช้แทน--apparent-size
Arnauld VM

17

คุณสามารถใช้ได้ du -h -c directory|tail -1

สิ่งนี้จะสร้างบรรทัดเดียวพร้อมการใช้หน่วยความจำ


15
du -hs directoryถ้าคุณต้องการทั้งหมด
Stéphane Chazelas

8

เพียงพิมพ์บรรทัดปัจจุบันที่คุณรวมผลรวม:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'

6

ด้วย perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

ขนาดของไฟล์ PDF ที่ไม่ถูกซ่อนทั้งหมดในไดเรกทอรีปัจจุบัน


1

การเพิ่มสิ่งต่อไปนี้ใน. bash_profile หรือ. bashrc ใช้ได้สำหรับฉัน

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

ตอนนี้เมื่อฉันทำ dir * .mp3 มันจะวนซ้ำและพิมพ์ทั้งหมดในตอนท้าย คุณสามารถควบคุมความลึกที่คุณต้องการโดยการเพิ่มพารามิเตอร์ maxdepth ลงในการค้นหา ฉันรู้ว่าการค้นหาพบสองครั้งไม่ใช่ความคิดที่ดี แต่ฉันไม่สามารถคิดวิธีที่ดีกว่า อย่างน้อยก็ทำให้งานเสร็จ


1

การใช้คำสั่งduและawkเหมือนที่กล่าวไว้ข้างต้นจะให้สิ่งที่คุณกำลังมองหา

ตัวอย่าง: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

นี่จะแสดงรายการไฟล์ทั้งหมดในโฟลเดอร์ดาวน์โหลดของผู้ใช้ abc ลงท้ายด้วย. jpg และพิมพ์ผลรวมของไฟล์ทั้งหมดเหล่านี้ที่ส่วนท้ายของรายชื่อ


0

ในการรับทั้งเอาท์พุท dir และการคำนวณขนาดโดยไม่ต้องใช้ตัวเลือกอื่น ๆ ที่เสนอคุณสามารถใช้ tee (1) และการทดแทนกระบวนการ ...

dir | tee >( awk '{ total += $4 }; END { print total }' )

ไม่จำเป็นต้องใช้teeเพียงdir | awk '{print; total += $4}; END {print total}'
Stéphane Chazelas

0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'

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

เพื่อความเป็นธรรมกับผู้โพสต์นี่คือผลการค้นหาครั้งแรกสำหรับการค้นหาของ Google linux sum human readable sizesและเป็นสิ่งที่ฉันกำลังมองหา
Sridhar Sarnobat

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