ฉันจะจัดเรียงตามขนาดที่มนุษย์สามารถอ่านได้เป็นตัวเลขได้อย่างไร


20

ตัวอย่างเช่นฉันมีคำสั่งที่แสดงว่าโฟลเดอร์พื้นที่ใช้เวลาเท่าใด

du folder | sort -n

มันใช้งานได้ดี แต่ฉันต้องการรูปแบบที่มนุษย์อ่านได้

du -h folder

แต่ถ้าฉันทำมากกว่าที่ฉันไม่สามารถจัดเรียงเป็นตัวเลขได้

วิธีการเข้าร่วมdu folderและdu -h folderดูผลลัพธ์เรียงเป็นdu folderแต่มีคอลัมน์แรกจากdu -h folder

ปล. นี่เป็นเพียงตัวอย่าง เทคนิคนี้อาจมีประโยชน์มากสำหรับฉัน (ถ้าเป็นไปได้)

คำตอบ:


11

นี่คือวิธีการทั่วไปมากขึ้น รับเอาต์พุตdu folderและdu -h folderไฟล์สองไฟล์ที่แตกต่างกัน

du folder > file1
du -h folder > file2

ส่วนสำคัญคือสิ่งนี้: เชื่อมต่อกัน file1และfile2บรรทัดต่อบรรทัดด้วยตัวคั่นที่เหมาะสม

paste -d '#' file1 file2 > file3

(สมมติ#ว่าไม่ได้ปรากฏในfile1และfile2)

file3ตอนนี้การจัดเรียง โปรดทราบว่าสิ่งนี้จะจัดเรียงตามfile1เนื้อหาและแยกความสัมพันธ์โดยfile2เนื้อหา แยกผลลัพธ์ที่เกี่ยวข้องโดยใช้cut:

sort -n -k1,7 file3 | cut -d '#' -f 2

ดูman sortตัวเลือกอื่น ๆ ด้วย


คุณสามารถบันทึกเป็นนามแฝงเพื่อนำกลับมาใช้ใหม่ในภายหลัง โดยเพิ่มสิ่งต่อไปนี้ที่ด้านล่างของ~/.bashrc :

sorted-du () {
    paste -d '#' <( du "$1" ) <( du -h "$1" ) | sort -n -k1,7 | cut -d '#' -f 2
}

จากนั้นเปิดเทอร์มินัลเซสชันใหม่และดำเนินการนามแฝงใหม่ของคุณ:

sorted-du /home

ฉันเพิ่มส่วนสุดท้ายเกี่ยวกับวิธีทำให้โซลูชันของคุณเป็นนามแฝง
SirCharlo

1
การใช้ไฟล์จริงในนามแฝง (แล้วเรียก rm กับพวกเขา) เป็นความคิดที่แย่จริงๆ ! คิดว่าจะเกิดอะไรขึ้นถ้าฉันมีชื่อไฟล์file3ในไดเรกทอรีของฉันจริง ๆ แล้วมันจะถูกเขียนทับแล้วลบออก! @SirCharlo ฉันจะลบคำจำกัดความของนามแฝงออกจากคำตอบนี้และแทนที่ด้วยสิ่งที่ปลอดภัยกว่า
jmiserez

ดีaskubuntu.com/a/80248/22308ก็ทำเช่นนี้กับsort -h
น้ำ G VU

36

ลองสิ่งที่ชอบ:

du -h folder | sort -h

ทางเลือก: -nสำหรับการเรียงลำดับตัวเลข

หมายเหตุ: -hตัวเลือกการจัดเรียงมีอยู่ใน Ubuntu รุ่นใหม่กว่าเท่านั้น


3
มีในเวอร์ชั่น 8.17 ดังนั้นฉันเดาว่านี่เป็นวิธีที่ง่ายที่สุด
steabert

1
ขอบคุณ steabert ที่ชี้ให้เห็นว่าคำสั่ง sort ได้รับการปรับปรุงจาก sort --version = 8.17 นี่คือคำตอบที่ดีที่สุดสำหรับ Ubuntu รุ่นใหม่
Kat Amsterdam

นี่ควรจะเป็นสิ่งที่ยอมรับได้เพราะมันสะอาดหมดจดที่แก้ปัญหา OP ด้วยsort -h
Nam G VU

4

คำตอบนี้ถูกต้องสำหรับ10.04.4LTSและ Ubuntu เวอร์ชันต่ำกว่า

น่าเสียดายที่คำตอบที่ถูกต้องซึ่งจัดประเภท KMG นั้นยากและซับซ้อน:

คุณสามารถนามแฝงคำสั่ง du ทั้งหมดด้วยคำสั่งที่มนุษย์สามารถอ่านได้โดยใช้สิ่งนี้

alias duf='du -sk * | sort -n | perl -ne '\''($s,$f)=split(m{\t});for (qw(K M G)) {if($s<1024) {printf("%.1f",$s);print "$_\t$f"; last};$s=$s/1024}'\'

ซึ่งฉันพบที่นี่

http://www.earthinfo.org/linux-disk-usage-sorted-by-size-and-human-readable/

เพียงcdลงในโฟลเดอร์ที่คุณอยากรู้ duf

คุณสามารถเพิ่มนามแฝงนี้ไปยังจุดสิ้นสุดของ /home/user/.profile ของคุณเพื่อทำให้คำสั่ง duf กึ่งถาวร

ผล:

user@hostname:~$ duf
0.0K  Documenten
0.0K  Muziek
0.0K  Openbaar
0.0K  Sjablonen
0.0K  Video's
4.0K  backup_db.sql.g
4.0K  examples.desktop
12.0K xml printer ticket
52.0K hardinfo_report.html
152.0K    librxtxSerial.so
2.7M  jpos
4.4M  nxclient_3.5.0-7_amd64.deb
6.4M  nxnode_3.5.0-4_amd64.deb
6.8M  Downloads
7.4M  nxserver_3.5.0-5_amd64.deb
12.4M NetBeansProjects
18.1M mysqlworkbench.deb
28.3M Afbeeldingen
45.8M ergens-20110928-18.sql.gz
60.5M 2012-06-02ergens_archive.tar.gz
65.5M 2012-08-26ergens_archive.tar.gz
65.6M 2012-08-28ergens_archive.tar.gz
65.6M 2012-08-29ergens_archive.tar.gz
65.7M 2012-08-30ergens_archive.tar.gz
113.0M    Bureaublad
306.2M    ergens-20110928-18.sql

นี่คือสาเหตุที่du -sch /var/* | sort -nใช้งานไม่ได้ดูการเรียงลำดับของ MKKMMKKMMK

user@hostname:~$ du -sch /var/* |sort -n

0 /var/crash
0 /var/local
0 /var/lock
0 /var/opt
8,0M  /var/backups
12K   /var/games
16K   /var/tmp
17M   /var/log
68M   /var/cache
104K  /var/spool
144K  /var/run
351M  /var/lib
443M  totaal
704K  /var/mail

ฉันได้รายงานสิ่งนี้กับนักพัฒนา gnu-core พร้อมคำขอคุณลักษณะเพื่อปรับปรุงฟังก์ชัน du -h ด้วยคุณสมบัติการเรียงลำดับ via bugs-coreutils@gnu.org
Kat Amsterdam

+1, คล้ายกันแบบหนึ่งdu folder | sort -n | cut -f 2 | while IFS= read -r -d '' path; do du -sh -- "$path"; done
บรรทัด

เพิ่งลอง 1 ไลเนอร์ของคุณบนระบบถ่ายทอดสด รับข้อผิดพลาดถูกปฏิเสธการเข้าถึงและไม่มีผลลัพธ์ใด ๆ คุณลองคำสั่งนี้บนระบบ Ubuntu ก่อนหรือไม่? ฉันเปลี่ยนโฟลเดอร์เป็น / home / ชื่อผู้ใช้
Kat Amsterdam

โอ้ขออภัยคุณควรปล่อยไว้-d ''นั่นคือสิ่งที่เหลือไว้จากการใช้งานมันในผลลัพธ์ของคำสั่งไฟล์
steabert

นี้ดูเหมือนว่าจะดีการทำงานในระบบที่ไม่ลินุกซ์ที่ไม่สนับสนุน sortGNU
Stefan Lasiewski

2

คำสั่ง GNU sortมีตัวเลือกดังต่อไปนี้:

-h, --human-numeric-sort เปรียบเทียบตัวเลขการอ่านของมนุษย์ (เช่น 2K 1G)

หากต้องการมีตัวเลือกนี้ใน BSD / OSX คุณสามารถติดตั้งsortจากcoreutils(ผ่านbrew) และเพิ่มโฟลเดอร์ bin PATHลงในไฟล์rcของคุณ

ดังนั้นคำสั่งจะมีลักษณะดังนี้:

du -ah . | sort -rh | head -20

0

du -h directory | sort -hสำหรับรุ่นล่าสุดของอูบุนตูใช้

ฉันใช้รูปแบบนี้ตลอดเวลาเพื่อค้นหาไฟล์ที่อยู่นอกการควบคุม


คำตอบซ้ำวันที่ 17 พ.ย. 54 เวลา 17:13 น. Allu2
เอ็ลเดอ

0

เปิดเทอร์มินัลด้วยCtrl+ Alt+ tและพิมพ์:

  du -sk * | sort -rn 

: ตอนนี้ฉันคุ้นเคยกับการเปลี่ยน Ctrl + Alt + t เป็นรูปแบบด้านบนมาก ๆ เพื่อที่ฉันจะได้วางรูปแบบที่ต้องการเป็น Xpad ของฉัน : D รู้สึกดีที่ได้รับการชื่นชมสำหรับงานที่ต่ำต้อยเช่นนี้ :)
jobin

งานทุกอย่างที่คุณทำที่นี่คุ้มค่า
rɑːdʒɑ

0

อันนี้จัดการชื่อไฟล์ด้วย 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

สิ่งที่จุดของการแทนที่\nด้วย\0? มันสายเกินไปหรือไม่?
muru

เตรียมอินพุตสำหรับxargs -0ซึ่งคาดว่าอินพุตจะคั่นด้วย NUL (เนื่องจาก find -print0 สร้างขึ้น) มิฉะนั้นคุณจะไม่สามารถใช้ -0 และอะพอสโทรฟีมีความหมายพิเศษ
Mark Crossfield

ฉันรู้-0แต่ก็ไม่เกี่ยวข้อง: imgur.com/87w3vfj
muru

ฉันคิดว่ามันทำงานได้ดีเมื่อคุณใช้ backtick ไม่ใช่อะพอสโทรฟี gist.github.com/mrmanc/8aef830945ce03aa65f0
Mark Crossfield

0

สิ่งที่ฉันพบว่าทำงานได้กับทุกระบบโดยไม่คำนึงถึงเวอร์ชัน ( sort -hไม่ได้ผลสำหรับฉัน) คือ

du -h $(du * | sort -n | awk '{print $2}')

awk '{print $2}'พื้นพิมพ์ชื่อไฟล์

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