ค้นหาไฟล์หรือไดเรกทอรีที่ใหญ่ที่สุด


10

คำสั่งใดจะพิมพ์ขนาดของไฟล์และไดเรกทอรีทั้งหมดในไดเรกทอรี tmp (รวมถึงไฟล์ที่ซ่อนอยู่) และจัดเรียงตามขนาดจากมากที่สุดไปหาน้อยที่สุดในรูปแบบที่มนุษย์อ่านได้ (เช่น 2 GB)

ผลลัพธ์อาจเป็นดังนี้:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

ฉันพยายามใช้lsและduคำสั่ง แต่ไม่พบสวิตช์ที่ถูกต้อง

คำตอบ:


7

นี่คือการแก้ไขอย่างรวดเร็วใช้ du + sort ลองสิ่งนี้:

du -smc * | sort -n

สิ่งนี้จะเพิกเฉยต่อไฟล์ที่ซ่อนอยู่ แต่นั่นก็เป็นอีกวิธีง่ายๆ:

du -smc .[^.] .??* * | sort -n

สิ่งนี้อาจทำให้เกิดคำเตือนเกี่ยวกับหากหนึ่งในรูปแบบข้างต้นไม่ตรงกับไฟล์ รูปแบบแรก.[^.]ตรงกับชื่อไฟล์ของอักขระสองตัวที่ขึ้นต้นด้วย ยกเว้น .. รูปแบบที่สอง.??*ตรงกับตัวอักษรสามตัวหรือมากกว่าชื่อไฟล์ที่ขึ้นต้นด้วย และ * ตรงกับไฟล์ทั้งหมดที่ไม่ได้ขึ้นต้นด้วย สำหรับรายการที่ซับซ้อนยิ่งขึ้นเช่นการค้นหาไฟล์ทั้งหมดที่มีขนาดใหญ่กว่า X ในระบบไฟล์ทั้งหมดหรือรักษารายการการเติบโตของระบบไฟล์ฉันมีสคริปต์เชลล์ DIY บางตัวที่ฉันเขียนและสามารถแบ่งปันหากคุณสนใจ


ขอบคุณ. ฉันสนใจสคริปต์ของคุณถ้าคุณจะใจดี
xralf

1
ใช้sort -nrถ้าคุณต้องการคุณค่าที่ยิ่งใหญ่ที่สุด
LawrenceC

3

หากต้องการแสดงรายการไฟล์ที่ต้องการภายใต้/tmpจัดเรียงตามขนาด:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

หากต้องการแสดงรายการไฟล์และแผนผังไดเร็กทอรีภายใต้ทันที/tmpให้เรียงตามขนาด:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

หากต้องการแสดงรายการไฟล์และแผนผังไดเรกทอรีทั้งหมดที่ใดก็ตามภายใต้/tmpให้เรียงตามขนาด:

du -ak /tmp | sort -k1n -k2

(ตัวอย่างเพื่อแสดงให้เห็นถึงความแตกต่างระหว่างคำสั่งทั้งสาม: หากมีไฟล์/tmp/dir/fileรายการคำสั่งแรกรายการ/tmp/dir/fileที่สอง/tmp/dirและรายการที่สามทั้งสอง)

คำสั่งทั้งหมดข้างต้นแสดงขนาดเป็นกิโลไบต์ ในขณะที่ GNU du สามารถส่งออกขนาด "มนุษย์อ่านได้" (พร้อมตัวคูณ k, M, G, ฯลฯ ) การเรียงลำดับเป็นอีกเรื่องหนึ่ง ล่าสุด coreutils GNU พอ (≥7.4) สามารถทำมันได้เพียงแทนที่du -kด้วยdu -hและมีsort -k1n -k2 sort -k1h -k2มิฉะนั้นนี่คือสคริปต์ raw awk ที่จะแปลงเป็นขนาดที่ต่อท้าย (ปัดเศษลง); เพียงsortเอาท์พุทข้างบนเข้าไปในนั้น

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'

ขอบคุณ. คำสั่งเหล่านั้นมีประโยชน์ แต่ฉันสนใจเฉพาะไฟล์และไดเรกทอรีโดยตรงภายใต้ tmp ไม่ใช่ไฟล์ในไดเรกทอรีย่อย
xralf

1
@xralf: จากนั้นใช้รูปแบบการduโทรที่สองเท่านั้น
Gilles 'หยุดความชั่วร้าย'

ดูดี แต่ผลลัพธ์ที่ดีกว่าคือ MB และ GB เมื่อโพสต์ forcefsck
xralf

3

ฉันใช้นามแฝงต่อไปนี้: alias ds='du -x --all --max-depth=1 . | sort -n'

มันพิมพ์ขนาดของไฟล์ทั้งหมดและไดเรกทอรีย่อยระดับที่ 1 ของ dir ปัจจุบัน


มันเป็นคำตอบสั้น ๆ ที่ดี แต่มันพิมพ์เฉพาะไดเรกทอรี
xralf

โอ้ขอโทษคุณพูดถูก ฉันไม่เคยประสบปัญหานี้กับไฟล์ ยิ่งฉันพบวิธีทำให้มันทำงานกับไฟล์ได้อย่างไร: ใช้ - ทั้งหมด swicth
rvs

ทางออกที่ดีที่ถูกต้อง penguin359 ดีกว่าเล็กน้อยเพราะมันแสดงขนาดเป็น MB วิธีที่ดีที่สุดคือโซลูชันของ forcefsck แต่โซลูชันของเขาละเว้นไดเรกทอรีที่มีช่องว่าง
xralf

1

ด้วยรุ่นปัจจุบันของการจัดเรียง gnu (และการยืมรูปแบบไฟล์ @ penguin359)

cd /tmp; du -sShc .[^.] .??* * | sort -h

ด้วยการเรียงลำดับรุ่นเก่ากว่า

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

แก้ไข: เพิ่มพารามิเตอร์-Sduเพื่อไม่รวมไดเรกทอรีย่อย


ฉันต้องการพื้นที่ดิสก์ที่ใช้โดยไฟล์และไดเรกทอรี (ขนาดข้อมูลทั้งหมดภายใน) โดยตรงภายใต้ tmp (ไม่ใช่ไดเรกทอรีย่อย) คำสั่ง sort ของฉันไม่มีตัวเลือก -h
xralf

ฉันไม่แน่ใจ 100% ว่าคุณหมายถึงอะไรเพราะคุณยอมรับคำตอบด้วยการเลือกรูปแบบไฟล์เดียวกัน แก้ไขโพสต์ของฉันเพื่อไม่รวมส่วนย่อย หากคุณต้องการขนาดที่ชัดเจนและไม่ใช่พื้นที่ดิสก์จริงที่ใช้คุณอาจเพิ่ม--apparent-sizeพารามิเตอร์ du
forcefsck

ตอนนี้มันใช้งานได้ดี ฉันแค่ต้องมองหา GB และจากนั้น MB แต่ก็ไม่เป็นปัญหา
xralf

ฉันมีตัวอักษรหน่วยในลำดับที่ไม่ถูกต้องตอนนี้ได้รับการแก้ไข หากคุณต้องการคำสั่งจากใหญ่ไปเล็กเปลี่ยนลำดับของตัวอักษรหน่วยและเพิ่ม -r เพื่อเรียงลำดับ
forcefsck

ผมสังเกตเห็นก็ลืมที่จะพิมพ์ขนาดของไดเรกทอรี (ไม่มีคำนำหน้า.)
xralf

0

อัปเดต:ฉันได้เขียนสคริปต์ก่อนหน้านี้แล้ว นี่คือเวอร์ชันใหม่ที่ใช้duและawk ( เวอร์ชัน ก่อนหน้านี้ใช้treeและsed)

นี่คือผลลัพธ์ของ: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

นี่คือสคริปต์

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#

เมื่อคุณพูดถึงขนาดของไฟล์และไดเรกทอรีทั้งหมดคุณหมายถึงพื้นที่ที่รายการแต่ละรายการใช้บนดิสก์ (เช่นในระบบไฟล์Ubuntu ext4ของฉันไดเรกทอรีว่างจะใช้พื้นที่ดิสก์ 4k และไฟล์ที่มีขนาดเล็กกว่า 4k ใช้เวลา 4k . อันขั้นต่ำจัดสรรเป็น 4k) .. หรือคุณหมายถึงปริมาณของข้อมูลในแต่ละไฟล์เช่น 100 (ไบต์) .. และสำหรับไดเรกทอรีคุณต้องการที่จะทราบรวมของแฟ้มข้อมูลในไดเรกทอรีว่า .. ถ้า คุณต้องการขนาดของข้อมูลภายในไฟล์จากนั้นtreeทำเช่นนั้น ถ้าคุณต้องการพื้นที่ดิสก์ที่ใช้แล้วduไม่ว่า ... ( treeไม่รวมไดเรกทอรี)
Peter.O

'du'เป็นตัวเลือกที่ดีกว่า ... ฉันเพิ่งสังเกตเห็นman duว่ามันสามารถรายงาน"ขนาดไฟล์ที่ชัดเจน" .... The apparent size of a file is the number of bytes reported by wc -c 'ในไฟล์ปกติหรือมากกว่าโดยทั่วไปls -l --block-size=1' or stat --format =% s' ตัวอย่างเช่นไฟล์ที่มีคำว่าzoo' with no newline would, of course, have an apparent size of 3.
Peter.O

ฉันต้องการพื้นที่ดิสก์ที่ใช้โดยไฟล์และไดเรกทอรี (ขนาดข้อมูลทั้งหมดภายใน) โดยตรงภายใต้ tmp (ไม่ใช่ไดเรกทอรีย่อย)
xralf

ฉันขอโทษฉันไม่ได้อยู่ในขั้นตอนของการเขียนสคริปต์เชลล์ฉันสามารถเข้าใจได้ดังนั้นฉันจึงปล่อยให้ผู้ใช้รายอื่นตัดสินใจว่าคำตอบนั้นดีแค่ไหน ขอบคุณสำหรับการทำงาน ฉันจะศึกษาเมื่อฉันดีขึ้น
xralf

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