การจัดเรียงขนาดไฟล์ที่มนุษย์สามารถอ่านได้


16

ฉันจะจัดเรียงรายการโดยใช้การจัดเรียงขนาดไฟล์ที่มนุษย์สามารถอ่านได้การเรียงลำดับตัวเลขที่ใช้ตัวระบุขนาด (G, M, K) เข้ากับบัญชีได้อย่างไร ฉันสามารถเรียงลำดับdu -shผลลัพธ์เช่น ""

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

du -s * | sort -n

รายการนี้ไฟล์ / โฟลเดอร์เรียงตามขนาดของพวกเขา อย่างไรก็ตามค่าขนาดที่พิมพ์เป็นไบต์ (หรือเมกะไบต์หรือกิกะไบต์หากคุณเลือก)

มันจะเป็นที่พึงปรารถนาที่จะสามารถจัดเรียงตามค่าที่มนุษย์อ่านได้ดังนั้นฉันจึงสามารถเรียกใช้บางสิ่งที่คล้ายกันได้

du -sh * | <human-readable file sort>

และมีโฟลเดอร์ 1.5GB ปรากฏขึ้นหลังจาก 2.0M

คำตอบ:



29

ใช้ GNU coreutils> = 7.5:

du -hs * | เรียงลำดับ -h

(นำมาจากคำถามข้อผิดพลาดเซิร์ฟเวอร์นี้)

หน้าผู้ชาย

แก้ไข: คุณสามารถตรวจสอบเวอร์ชันของคุณโดยใช้du --versionและsort --versionหากคุณใช้เวอร์ชัน GNU หากคุณกำลังใช้ Homebrew คุณอาจจำเป็นต้องใช้และgdugsort


8
OSX ไม่มีตัวเลือกนี้ คุณสามารถใช้ homebrew เพื่อbrew install coreutils(ซึ่งเติมคำสั่ง coreutils ทั้งหมดด้วย 'g') gdu -hs * | gsort -hจากนั้นคุณสามารถทำได้
dsummersl

1
เพียงชี้แจง @ จุด dsummersl: ที่du -hs *ทำงานได้ดีบน Mac OS X แต่ผลตอบแทนsort -h sort: invalid option -- hหนึ่งยังสามารถติดตั้งแพคเกจ coreutils ผ่าน MacPorts ตามที่อธิบายไว้ที่นี่
jvriesem

3

หากคุณกังวลเกี่ยวกับไฟล์ที่มีขนาดใหญ่กว่า 1MB ดูเหมือนว่าคุณเป็นคุณสามารถใช้คำสั่งนี้เพื่อจัดเรียงและใช้ awk เพื่อแปลงขนาดเป็น MB:

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

อีกครั้งนี้จะปัดขนาดเป็น MB ที่ใกล้ที่สุด คุณสามารถแก้ไขมันแปลงเป็นหน่วยที่คุณเลือก


สิ่งนี้คล้ายกับ: du -sm * | sort -n. -s/ -gทำให้duขนาดผลงานเป็นเมกะไบต์ / กิกะไบต์
notnoop

สำหรับ MB คุณต้องหารด้วย 1024 อีก ดังนั้นมันจะเป็นint($1 / (1024 * 1024))
Pratik Khadloya

2

อันนี้จัดการชื่อไฟล์ด้วย whitespace หรือ apostrophes และทำงานบนระบบที่ไม่รองรับxargs -dหรือsort -h:

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

ซึ่งผลลัพธ์ใน:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm

1

นี่คืออีกหนึ่ง:

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

คุณอาจต้องทำ

$ cpan Number::Bytes::Human

เป็นครั้งแรก


1

du -sk * | เรียง -n | awk '{พิมพ์ $ 2}' | ในขณะที่อ่าน f; ทำ du -sh "$ f"; เสร็จแล้ว


1

คำสั่งนี้จะเรียงตามขนาดเป็น MB

du --block-size=MiB --max-depth=1 path | sort -n

นั่นคือสิ่งที่ผู้ใช้กำลังทำอยู่จริงเขา / เธอไม่ได้ให้ตัวอย่างกับ MiB แต่พูดถึงมัน สิ่งที่เขา / เธอกำลังมองหาคือการสามารถจัดเรียงเมื่อใช้-hธงเพื่อ du
Tonin

0

ฉันสิ้นสุดที่นี่เนื่องจากฉันพยายามเรียงลำดับอย่างอื่นที่รวม MB และ GB ในผลลัพธ์เดียวกันและฉันไม่สามารถควบคุมได้

$NFถูกใช้ตั้งแต่#GBหรือ#MBรูปแบบเป็นคอลัมน์สุดท้ายในเอาต์พุต:

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

คำอธิบายของคำสั่ง awk:

if ($NF ~ /[0-9\.]+GB/)

หากคอลัมน์สุดท้ายตรงกับรูปแบบ regex ซึ่งมีตัวเลขหรือ.หนึ่งครั้งหรือมากกว่านั้นตามด้วยGB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

จากนั้นตั้งค่าตัวแปรaเป็นส่วนหลักของแต่ละบรรทัดที่ตรงกับรูปแบบ regex เดียวกันในคอลัมน์สุดท้ายเดียวกัน ( $NF)

printf "%sMB\n", a*1024} \

หลังจากการตั้งค่าaใช้printfสำหรับฟอร์แมตเอาต์พุตเป็น${a*1024}MB

else {print $NF}

มิฉะนั้นเพียงพิมพ์คอลัมน์สุดท้าย

sort -n

ใช้การเรียงลำดับตัวเลขบนเอาต์พุต


ตัวอย่าง

echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

ฉันแน่ใจว่ามีวิธีที่จะนำรูปแบบ regex มาใช้ใหม่ดังนั้นฉันจึงทำการแข่งขันเพียงครั้งเดียวและแทนที่ แต่ฉันยังไม่รู้วิธีการทำ :)

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