เมื่อฉันใช้ls
หรือdu
ฉันได้รับจำนวนเนื้อที่ดิสก์ที่แต่ละไฟล์ครอบครองอยู่
ฉันต้องการผลรวมของข้อมูลทั้งหมดในไฟล์และไดเร็กทอรีย่อยที่ฉันจะได้รับถ้าฉันเปิดแต่ละไฟล์และนับจำนวนไบต์ คะแนนโบนัสหากฉันสามารถรับสิ่งนี้ได้โดยไม่ต้องเปิดแต่ละไฟล์และนับ
เมื่อฉันใช้ls
หรือdu
ฉันได้รับจำนวนเนื้อที่ดิสก์ที่แต่ละไฟล์ครอบครองอยู่
ฉันต้องการผลรวมของข้อมูลทั้งหมดในไฟล์และไดเร็กทอรีย่อยที่ฉันจะได้รับถ้าฉันเปิดแต่ละไฟล์และนับจำนวนไบต์ คะแนนโบนัสหากฉันสามารถรับสิ่งนี้ได้โดยไม่ต้องเปิดแต่ละไฟล์และนับ
du
ไม่สามารถใช้เพื่อตอบคำถามนี้ แสดงจำนวนเนื้อที่ดิสก์ที่ไดเร็กทอรีครอบครองบนดิสก์ (ข้อมูลของไฟล์บวกขนาดของข้อมูลเมตาของระบบไฟล์เสริม) du
เอาท์พุทสามารถแม้จะมีขนาดเล็กกว่าขนาดของไฟล์ทั้งหมด สิ่งนี้อาจเกิดขึ้นหากระบบไฟล์สามารถจัดเก็บข้อมูลที่บีบอัดไว้ในดิสก์หรือหากใช้ฮาร์ดลิงก์ คำตอบที่ถูกต้องอยู่บนพื้นฐานและls
find
ดูคำตอบของNelsonและbytepanที่นี่หรือคำตอบนี้: unix.stackexchange.com/a/471061/152606
คำตอบ:
หากคุณต้องการ 'ขนาดที่ชัดเจน' (นั่นคือจำนวนไบต์ในแต่ละไฟล์) ไม่ใช่ขนาดที่ไฟล์บนดิสก์ใช้-b
หรือ--bytes
ตัวเลือก (หากคุณมีระบบ Linux ที่มีแกน GNU ):
% du -sbh <directory>
du -shb
(ตามที่แนะนำโดยคำตอบนี้) -b
ดูเหมือนว่าการตั้งค่าจะแทนที่การ-h
ตั้งค่านั้น
du -sh --apparent-size /dir/
ใช้du -sb
:
du -sb DIR
หรือเพิ่มh
ตัวเลือกสำหรับเอาต์พุตที่ใช้งานง่ายมากขึ้น:
du -sbh DIR
brew install coreutils
กับเบียร์: gdu
มันจะสามารถเป็นคำสั่ง
ls
-> file.gz hardlink-to-file.gz
. stat -c %s file.gz
-> 9657212
. stat -c %s hardlink-to-file.gz
-> 9657212
. du -sb
-> 9661308
. ไม่ใช่ขนาดทั้งหมดของเนื้อหา แต่เป็นขนาดที่ไดเร็กทอรีใช้บนดิสก์
cd ไปยังไดเร็กทอรีจากนั้น:
du -sh
ftw!
เดิมเขียนเกี่ยวกับเรื่องนี้ที่นี่: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/
-L
ตัวเลือกdu
ตาม symlinks
เพียงทางเลือก:
ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
grep -v '^d'
จะไม่รวมไดเรกทอรี
ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
du
โซลูชันนี้จะนับขนาดรวมของข้อมูลทั้งหมดในไฟล์ราวกับว่าเปิดทีละไฟล์และนับจำนวนไบต์ แต่ใช่การเพิ่ม-A
พารามิเตอร์จะต้องนับไฟล์ที่ซ่อนอยู่ด้วย
find -print0
และxargs -0
จำเป็นสำหรับชื่อไฟล์ที่มีช่องว่าง OS X stat -f %z
ต้องการ
du
รายงาน)
du
ยูทิลิตี้ผิดพลาดคำตอบนี้ถูกต้อง มันจะคล้ายกันมากที่จะตอบที่นี่: unix.stackexchange.com/a/471061/152606 แต่ฉันจะใช้! -type d
แทน-type f
การนับ symlink ด้วย (ขนาดของ symlink เอง (โดยปกติจะมีไม่กี่ไบต์) ไม่ใช่ขนาดของไฟล์ที่ชี้ไป)
หากคุณใช้ "du" ของ busybox ในระบบ emebedded คุณจะไม่สามารถรับไบต์ที่แน่นอนด้วย du ได้เฉพาะ Kbytes เท่านั้นที่คุณจะได้รับ
BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary
Usage: du [-aHLdclsxhmk] [FILE]...
Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.
Options:
-a Show sizes of files in addition to directories
-H Follow symbolic links that are FILE command line args
-L Follow all symbolic links encountered
-d N Limit output to directories (and files with -a) of depth < N
-c Output a grand total
-l Count sizes many times if hard linked
-s Display only a total for each argument
-x Skip directories on different filesystems
-h Print sizes in human readable format (e.g., 1K 243M 2G )
-m Print sizes in megabytes
-k Print sizes in kilobytes(default)
เมื่อสร้างโฟลเดอร์ระบบไฟล์ Linux จำนวนมากจะจัดสรร 4096 ไบต์เพื่อจัดเก็บข้อมูลเมตาบางอย่างเกี่ยวกับไดเร็กทอรี พื้นที่นี้จะเพิ่มขึ้นเป็นทวีคูณ 4096 ไบต์เมื่อไดเร็กทอรีเติบโตขึ้น
คำสั่งdu (มีหรือไม่มีตัวเลือก -b) จะนับช่องว่างนี้ดังที่คุณเห็นการพิมพ์:
mkdir test && du -b test
คุณจะได้ผลลัพธ์ 4096 ไบต์สำหรับ dir ว่าง ดังนั้นหากคุณใส่ไฟล์ 2 ไฟล์ที่มี 10,000 ไบต์ไว้ใน dir จำนวนทั้งหมดที่กำหนดโดยdu -sbจะเท่ากับ 24096 ไบต์
หากคุณอ่านคำถามอย่างละเอียดนี่ไม่ใช่สิ่งที่ถาม ผู้ถามถามว่า
ผลรวมของข้อมูลทั้งหมดในไฟล์และไดเร็กทอรีย่อยที่ฉันจะได้รับถ้าฉันเปิดแต่ละไฟล์และนับไบต์
ในตัวอย่างด้านบนควรเป็น 20000 ไบต์ไม่ใช่ 24096
ดังนั้นคำตอบที่ถูกต้อง IMHO อาจเป็นการผสมผสานระหว่างคำตอบของเนลสันและคำแนะนำhlovdalเพื่อจัดการชื่อไฟล์ที่มีช่องว่าง:
find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'
มีอย่างน้อยสามวิธีในการรับ "ผลรวมของข้อมูลทั้งหมดในไฟล์และไดเร็กทอรีย่อย" เป็นไบต์ที่ทำงานได้ทั้งใน Linux / Unix และ Git Bash สำหรับ Windows โดยเรียงลำดับจากเร็วที่สุดไปยังช้าที่สุดโดยเฉลี่ย สำหรับการอ้างอิงของคุณไฟล์เหล่านี้ถูกเรียกใช้ที่รูทของระบบไฟล์ที่ค่อนข้างลึก ( docroot
ในการติดตั้ง Magento 2 Enterprise ประกอบด้วยไฟล์ 71,158 ไฟล์ใน 30,027 ไดเร็กทอรี)
1.
$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes
real 0m0.221s
user 0m0.068s
sys 0m0.160s
2.
$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes
real 0m0.256s
user 0m0.164s
sys 0m0.196s
3.
$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes
real 0m0.553s
user 0m0.308s
sys 0m0.416s
ทั้งสองนี้ใช้งานได้เช่นกัน แต่ต้องอาศัยคำสั่งที่ไม่มีใน Git Bash สำหรับ Windows:
1.
$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes
real 0m0.233s
user 0m0.116s
sys 0m0.176s
2.
$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes
real 0m0.242s
user 0m0.104s
sys 0m0.152s
หากคุณต้องการเพียงผลรวมสำหรับไดเร็กทอรีปัจจุบันให้เพิ่มลง-maxdepth 1
ในfind
.
โปรดทราบว่าโซลูชันที่แนะนำบางส่วนไม่ให้ผลลัพธ์ที่ถูกต้องดังนั้นฉันจึงใช้วิธีแก้ปัญหาข้างต้นแทน
$ du -sbh
832M .
$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525
$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471
$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133
dc
เป็นส่วนหนึ่งของbc
แพคเกจเพื่อที่จะได้รับdc
bc
มันจะต้องติดตั้ง
สำหรับ Win32 DOS คุณสามารถ:
c:> dir / sc: \ directory \ you \ want
และบรรทัดสุดท้ายจะบอกคุณว่าไฟล์ใช้เวลากี่ไบต์
ฉันรู้ว่าสิ่งนี้อ่านไฟล์และไดเรกทอรีทั้งหมด แต่ทำงานได้เร็วขึ้นในบางสถานการณ์
du
มีประโยชน์ แต่find
มีประโยชน์ในกรณีที่คุณต้องการคำนวณขนาดของไฟล์บางไฟล์เท่านั้น (ตัวอย่างเช่นใช้ตัวกรองตามนามสกุล) โปรดทราบว่าfind
ตัวเองสามารถพิมพ์ขนาดของแต่ละไฟล์เป็นไบต์ ในการคำนวณขนาดทั้งหมดเราสามารถเชื่อมต่อdc
คำสั่งในลักษณะต่อไปนี้:
find . -type f -printf "%s + " | dc -e0 -f- -ep
ที่นี่find
สร้างลำดับของคำสั่งสำหรับเช่นdc
123 + 456 + 11 +
แม้ว่าโปรแกรมที่เสร็จสมบูรณ์ควรเป็นอย่างไร0 123 + 456 + 11 + p
(จำสัญกรณ์ postfix)
ดังนั้นเพื่อให้ได้โปรแกรมที่เสร็จสมบูรณ์เราต้องวาง0
บนสแต็กก่อนที่จะดำเนินการตามลำดับจาก stdin และพิมพ์หมายเลขบนสุดหลังจากเรียกใช้งาน ( p
คำสั่งที่อยู่ท้าย) เราบรรลุได้ด้วยdc
ตัวเลือก:
-e0
เป็นเพียงทางลัด-e '0'
ที่วาง0
บนสแต็ก-f-
มีไว้สำหรับอ่านและดำเนินการคำสั่งจาก stdin (ที่สร้างโดยfind
ที่นี่)-ep
ใช้สำหรับพิมพ์ผลลัพธ์ ( -e 'p'
)ในการพิมพ์ขนาดใน MiB อย่างที่284.06 MiB
เราสามารถใช้-e '2 k 1024 / 1024 / n [ MiB] p'
ในจุดที่ 3 แทน (ช่องว่างส่วนใหญ่เป็นทางเลือก)
สิ่งนี้อาจช่วยได้:
ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
คำสั่งดังกล่าวจะรวมไฟล์ทั้งหมดออกจากขนาดไดเร็กทอรี
-A
ls
ใช้:
$ du -ckx <DIR> | grep total | awk '{print $1}'
โดย <DIR> คือไดเร็กทอรีที่คุณต้องการตรวจสอบ
'-c' ให้ข้อมูลทั้งหมดจำนวนมากซึ่งถูกแยกโดยใช้ส่วน 'grep total' ของคำสั่งและจำนวนใน Kbytes จะถูกดึงออกมาด้วยคำสั่ง awk
ข้อแม้เดียวที่นี่คือถ้าคุณมีไดเรกทอรีย่อยที่มีข้อความ "ทั้งหมด" มันก็จะถูกคายออกไปเช่นกัน
ls
แสดงจำนวนไบต์ในแต่ละไฟล์ไม่ใช่จำนวนเนื้อที่ดิสก์ เพียงพอสำหรับความต้องการของคุณหรือไม่?