วิธีแสดงรายการไฟล์ทั้งหมดเรียงตามขนาด


241

ฉันต้องการแสดงรายการไฟล์ทั้งหมดตามลำดับขนาดใหญ่ถึงขนาดเล็กและไฟล์อาจปรากฏที่ใดก็ได้ในโฟลเดอร์บางโฟลเดอร์



5
จากman ls:-S sort by file size
ctrl-alt-delor

คุณหมายถึง“ ไฟล์อยู่ในไดเรกทอรีนี้” หรือ“ ไฟล์อาจอยู่ในไดเรกทอรีย่อยใด ๆ ”
ctrl-alt-delor

หากคุณกำลังสามารถ / ต้องการใช้เครื่องมือ GUI ที่ใช้เวลาดูที่QDirStatเดิมKDirStat
RhinoDevel

คำตอบ:


290

เพียงใช้สิ่งที่ชอบ:

ls -lS /path/to/folder/

ทุนS

นี่จะเรียงลำดับไฟล์ตามขนาด

ดูเพิ่มเติมที่:

man ls

-S     sort by file size

หากคุณต้องการเรียงลำดับย้อนกลับเพียงเพิ่ม-rสวิตช์

ปรับปรุง:

ในการแยกไดเรกทอรี (และไม่ได้ระบุชื่อไฟล์หรือเป้าหมาย symlink ให้ประกอบด้วยอักขระขึ้นบรรทัดใหม่):

ls -lS | grep -v '^d' 

อัปเดต 2:

ตอนนี้ฉันเห็นว่ามันยังคงแสดงลิงก์สัญลักษณ์ซึ่งอาจเป็นโฟลเดอร์ ลิงก์สัญลักษณ์มักเริ่มต้นด้วยตัวอักษร l เช่นเดียวกับในลิงก์

-เปลี่ยนคำสั่งเพื่อกรองหา สิ่งนี้ควรปล่อยให้ไฟล์ปกติเท่านั้น:

ls -lS | grep '^-'

ในระบบของฉันจะแสดงเฉพาะไฟล์ปกติ

อัปเดต 3:

ในการเพิ่มการเรียกซ้ำฉันจะปล่อยให้การเรียงลำดับของบรรทัดในsortคำสั่งและบอกให้ใช้คอลัมน์ที่ 5 เพื่อเรียงลำดับ

ls -lR | grep '^-' | sort -k 5 -rn

-rnหมายถึงย้อนกลับและเป็นตัวเลขเพื่อให้ได้ไฟล์ที่ใหญ่ที่สุดที่ด้านบน ด้านล่างของคำสั่งนี้คือมันไม่ได้แสดงเส้นทางแบบเต็มของไฟล์

หากคุณต้องการเส้นทางแบบเต็มของไฟล์ใช้สิ่งนี้:

find . -type f  -exec du -h {} + | sort -r -h

findคำสั่งซ้ำจะพบไฟล์ทั้งหมดในไดเรกทอรีย่อยทั้งหมด.และโทรdu -h(หมายถึงการใช้งานดิสก์ -humanreadable ) แล้วเรียงการส่งออกอีกครั้ง หากคุณfind/ sortไม่สนับสนุนการ-hแทนที่ด้วยและdu -k sort -rnโปรดทราบว่าขนาดและการใช้ดิสก์นั้นไม่เหมือนกัน


5
duให้การใช้งานดิสก์ซึ่งแตกต่างจากขนาดไฟล์ ด้วย (GNU) การdu -hเรียงลำดับตัวเลขจะไม่ทำงาน (คุณจะต้องใช้-hตัวเลือก GNU ในการจัดเรียง) xargs คาดหวังรายการคำที่ยกมาอาจเป็นอินพุตดังนั้นมันจะไม่ทำงานหากชื่อไฟล์มีช่องว่างหรืออักขระที่ยกมา
Stéphane Chazelas

1
ฉันเห็นว่า -S ไม่ได้เรียงตามขนาดมากขึ้น
demongolem

3
ต่อไปนี้ @ find . -type f -print0 | xargs -0 du -h | sort -rhStéphaneChazelasนี้ทำงานสำหรับฉัน: ถ้าคุณเพียงต้องการบอกว่าใหญ่ที่สุด 30 find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30ไฟล์:
user7543

Hi! คุณช่วยอธิบาย+ |ไวยากรณ์ได้+ | sort -r -hไหม?
วิกเตอร์

@Victor โปรดดูunix.stackexchange.com/questions/195939/...
Hew Wolff

25

คุณสามารถใช้สิ่งที่ต้องการค้นหาและจัดเรียง

find . -type f -ls | sort -r -n -k7

( -lsตัวเลือกไม่ได้เป็นแบบมาตรฐาน แต่พบได้ในการใช้งานการค้นหาจำนวนมากไม่เพียง แต่ GNU หนึ่งตัวใน GNU find และอื่น ๆ มันแสดงสิ่งที่คล้ายls -liกับข้อยกเว้นบางประการเช่นไฟล์ที่มี ACL ไม่ได้ทำเครื่องหมาย +)

หากชื่อไฟล์อาจมีอักขระขึ้นบรรทัดใหม่ด้วย GNU find และ GNU sort:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'

สิ่งนี้ถือว่าคอลัมน์ "กลุ่ม" (จาก -ls) ไม่มีช่องว่างใด ๆ (ดังนั้นพารามิเตอร์ -k 7) แต่ไม่จำเป็นต้องเป็นกรณี
kolistivra

1
ทำไมไม่ทำเพียงหา ... -print0 | จัดเรียง -zk7rn0 หรือไม่
Andre de Miranda

10

ด้วย zsh และ GNU ls:

ls -ldU -- **/*(.OL)

ที่ไหน(.OL)เป็นรอบคัดเลือก glob , .เพื่อเลือกปกติไฟล์เท่านั้นOLที่จะกลับคำสั่งโดยความยาว (ขนาดไฟล์o สำหรับการขึ้นการสั่งซื้อOสำหรับการไปหาน้อย)

(โปรดทราบว่า zsh เวอร์ชันเก่ามีปัญหากับขนาดไฟล์ที่เกิน 2 ^ 32)

ระบบปฏิบัติการบางระบบมีข้อ จำกัด เกี่ยวกับขนาดของรายการอาร์กิวเมนต์ที่ส่งไปยังคำสั่ง ในกรณีดังกล่าวคุณจะต้อง:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

หากคุณต้องการรายการไฟล์และไม่แสดงรายละเอียดให้ทำดังนี้

print -rl -- **/*(.OL)

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

print -rl -- **/*(.DOL)

สิ่งที่ไม่.OLทำอะไร? เป็นส่วนหนึ่งของคำสั่งนั้นหรือไม่?
alpha_989

@ alpha_989 โปรดดูการแก้ไข
Stéphane Chazelas

ขอบคุณสำหรับคำอธิบายสเตฟาน .. แต่ด้วยเหตุผลบางอย่าง .. คำสั่งไม่ทำงานบนเวิร์กสเตชันของฉัน .. ฉันใช้และls (GNU coreutils) 8.25 zsh 5.1.1 (x86_64-ubuntu-linux-gnu)มันทำงานเฉพาะสำหรับบางรุ่นlsและzsh?
alpha_989

@ alpha_989 มันไม่ได้ผลสำหรับคุณ มันใช้งานได้สำหรับฉันกับเวอร์ชันเดียวกันและไม่มีอะไรในรหัสที่จะไม่ทำงานในเวอร์ชันตั้งแต่ 15 ปีก่อนอย่างน้อย
Stéphane Chazelas

9

รายการไฟล์ตามขนาดจากน้อยไปมากจะเป็น:

ls -lSr

ตัวเลือกคือ:

  • l: ยาวแสดงรายละเอียดผู้ใช้กลุ่มคุณลักษณะอื่น ๆ วันที่ ฯลฯ
  • S: คำสั่งซื้อตามขนาด (มากไปหาน้อยตามค่าเริ่มต้น)
  • r: กลับคำสั่งของรายการ

คุณจะอธิบายตัวเลือกต่างๆเพื่อปรับปรุงคุณภาพของคำตอบหรือไม่?
Rui F Ribeiro

6

การพูดว่า "ไฟล์อาจมีอยู่ทุกที่ในโฟลเดอร์" หมายความว่าคุณต้องการสืบทอดไดเรกทอรี (โฟลเดอร์) ทั้งหมดซ้ำภายในไดเรกทอรีเริ่มต้น (โฟลเดอร์) นี่คือสิ่งที่findตั้งใจทำ:

find . -type f -exec ls -lSd {} +

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


1
นี่เป็นสิ่งที่ดีเนื่องจากช่วยให้คุณใช้ -h
โมดิฟายเออร์

4

รายการไฟล์แสดงในลำดับย้อนกลับ: ls -lSrh

สำหรับเรียงลำดับ: ls -lSh


1
+1 สำหรับการใช้แฟล็ก -h สำหรับเอาต์พุตที่เป็นมิตรกับมนุษย์
computingfreak

2

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

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}

2

ลองสิ่งเหล่านี้มันใช้ได้ดีสำหรับฉัน

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

ไม่ใช่คำตอบที่สมบูรณ์แบบ แต่ใช้ได้ในระดับหนึ่ง

$ ls -lS |grep  '^-' | head -n 6 

1
awk ทำงานได้ดีหากชื่อไฟล์ไม่มีช่องว่าง
Eir Nym

ใช่ .. ใช้ 'sed' และแทนที่ space ด้วยขีดล่าง? ถ้านั่นจะช่วยได้
Sand1512

ไม่ฉันใช้sedเพื่อตัดเอาต์พุต
Eir Nym

1

กำลังเพิ่มคำตอบของ delh และความคิดเห็นของStéphane Chazelas ...

find -print0รวมกับxargs -0เพิ่มการสนับสนุนสำหรับช่องว่าง / ช่องว่าง / whatnots

du -h | sort -rn ไม่เรียงลำดับอย่างถูกต้องระหว่างทวีคูณทวีคูณที่แตกต่างกันเช่น 1.1M จะแสดงหลังจาก 128K ซึ่งผิด

sort -rh (- ตัวเลขเชิงมนุษย์เรียงลำดับ) จะดูแล แต่ก็ใช้ได้กับเวอร์ชั่นของ GNU เท่านั้น

คำสั่งด้านล่างจะให้ผลลัพธ์ที่ต้องการ

มนุษย์สามารถอ่านได้บน GNU's sort / Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

ในหน่วยกิโลไบต์บน BSD / OSX / อื่น ๆ :

find . -type f -print0 | xargs -0 du -k | sort -rn

สำหรับ BSD / OSX, ยังเห็นhttps://unix.stackexchange.com/a/188375/82895


1

ในรูปแบบของคำถามเดิมหากคุณต้องการดูขนาดสะสมของไฟล์ในไดเรกทอรีย่อย:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

ขนาดจะปรากฏเป็นเมกะไบต์ ( mในdu -sm) ค่าอื่น ๆ ที่ยอมรับโดยใช้duเป็น-kกิโลไบต์-gสำหรับกิกะไบต์ การใช้-hจอแสดงผลที่มนุษย์อ่านไม่ได้เป็นไปไม่ได้เพราะจะทำให้การคัดแยกเสียหาย

นี่คือรุ่นที่ใช้sedสำหรับผนวกMเมกะไบต์:

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

ไดเรกทอรีที่จะแสดงมีการตั้งค่าผ่าน${1:-.}ซึ่งจะใช้อาร์กิวเมนต์บรรทัดคำสั่งแรกถ้ามีให้หรือใช้ไดเรกทอรีปัจจุบันถ้าเรียกว่าไม่มีข้อโต้แย้ง

หมายเหตุ: ขั้นตอนนี้อาจใช้เวลานานกับไฟล์จำนวนมาก ตัวเลือก-type dจะแสดงเฉพาะไดเรกทอรีย่อยและไม่รวมไฟล์ในโฟลเดอร์ปัจจุบัน หากคุณต้องการดูไฟล์ในโฟลเดอร์ปัจจุบันให้ลบออก

หมายเหตุ: คุณอาจต้องการใช้ncduแทนซึ่งมีอยู่ใน repos linux ส่วนใหญ่ (บน Ubuntu / debian apt install ncdu) เช่นเดียวกับบน osx ( brew install ncdu)

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