ฉันต้องการแสดงรายการไฟล์ทั้งหมดตามลำดับขนาดใหญ่ถึงขนาดเล็กและไฟล์อาจปรากฏที่ใดก็ได้ในโฟลเดอร์บางโฟลเดอร์
man ls
:-S sort by file size
ฉันต้องการแสดงรายการไฟล์ทั้งหมดตามลำดับขนาดใหญ่ถึงขนาดเล็กและไฟล์อาจปรากฏที่ใดก็ได้ในโฟลเดอร์บางโฟลเดอร์
man ls
:-S sort by file size
คำตอบ:
เพียงใช้สิ่งที่ชอบ:
ls -lS /path/to/folder/
ทุนS
นี่จะเรียงลำดับไฟล์ตามขนาด
ดูเพิ่มเติมที่:
-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
โปรดทราบว่าขนาดและการใช้ดิสก์นั้นไม่เหมือนกัน
du
ให้การใช้งานดิสก์ซึ่งแตกต่างจากขนาดไฟล์ ด้วย (GNU) การdu -h
เรียงลำดับตัวเลขจะไม่ทำงาน (คุณจะต้องใช้-h
ตัวเลือก GNU ในการจัดเรียง) xargs คาดหวังรายการคำที่ยกมาอาจเป็นอินพุตดังนั้นมันจะไม่ทำงานหากชื่อไฟล์มีช่องว่างหรืออักขระที่ยกมา
find . -type f -print0 | xargs -0 du -h | sort -rh
StéphaneChazelasนี้ทำงานสำหรับฉัน: ถ้าคุณเพียงต้องการบอกว่าใหญ่ที่สุด 30 find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30
ไฟล์:
+ |
ไวยากรณ์ได้+ | sort -r -h
ไหม?
คุณสามารถใช้สิ่งที่ต้องการค้นหาและจัดเรียง
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'
ด้วย 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
ทำอะไร? เป็นส่วนหนึ่งของคำสั่งนั้นหรือไม่?
ls (GNU coreutils) 8.25
zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
มันทำงานเฉพาะสำหรับบางรุ่นls
และzsh
?
รายการไฟล์ตามขนาดจากน้อยไปมากจะเป็น:
ls -lSr
ตัวเลือกคือ:
การพูดว่า "ไฟล์อาจมีอยู่ทุกที่ในโฟลเดอร์" หมายความว่าคุณต้องการสืบทอดไดเรกทอรี (โฟลเดอร์) ทั้งหมดซ้ำภายในไดเรกทอรีเริ่มต้น (โฟลเดอร์) นี่คือสิ่งที่find
ตั้งใจทำ:
find . -type f -exec ls -lSd {} +
นี่เป็น "ค้นหา" ไฟล์ทั้งหมดในไดเรกทอรีการทำงานปัจจุบัน ( .
) สำหรับแต่ละไฟล์ที่พบls
กระบวนการจะถูกเรียกใช้เพื่อเรียงลำดับวัตถุที่พบตามลำดับขนาด +
Terminator ไปหลายสาเหตุข้อโต้แย้งที่จะผ่านเป็นรายการไป-exec
ls
หากไดเรกทอรี (โฟลเดอร์) ของคุณมีไฟล์จำนวนมากคุณควรมีหนึ่งรายการ (และทำให้กระบวนการหนึ่งแยก) นำไปสู่ผลลัพธ์ที่คุณต้องการ
รายการไฟล์แสดงในลำดับย้อนกลับ: ls -lSrh
สำหรับเรียงลำดับ: ls -lSh
ฉันเขียนบางสิ่งบางอย่างในระดับนี้กลับไปสักพัก คุณสามารถผ่านการโต้แย้งเพื่อระบุจำนวนไฟล์ที่จะแสดงหรือเพียงแค่พิมพ์big
สิ่งที่คุณจะได้รับ 10
big () {
NUM_FILES=10;
if [ $1 ]; then
NUM_FILES=$1;
fi;
du | sort -nr | head -n $NUM_FILES
}
ลองสิ่งเหล่านี้มันใช้ได้ดีสำหรับฉัน
$ 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
sed
เพื่อตัดเอาต์พุต
กำลังเพิ่มคำตอบของ 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
ในรูปแบบของคำถามเดิมหากคุณต้องการดูขนาดสะสมของไฟล์ในไดเรกทอรีย่อย:
#!/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 / debianapt install ncdu
) เช่นเดียวกับบน osx (brew install ncdu
)