จัดเรียงไฟล์ตามขนาดที่เรียกซ้ำ


78

ฉันต้องการค้นหาไฟล์ที่ใหญ่ที่สุดในโฟลเดอร์
ฉันจะสแกนโฟลเดอร์ซ้ำและเรียงลำดับเนื้อหาตามขนาดได้อย่างไร

ฉันได้ลองใช้ls -R -Sแต่มันแสดงรายการไดเรกทอรีเช่นกัน
ฉันก็ลองใช้findดู


1
คุณต้องการแสดงรายการไฟล์ในแต่ละไดเรกทอรีย่อยแยกกันหรือคุณต้องการค้นหาไฟล์ทั้งหมดในส่วนย่อยทั้งหมดและทำรายการตามขนาดโดยไม่คำนึงว่าเป็นส่วนย่อยใด? นอกจากนี้คุณหมายถึงอะไรโดย "ไดเรกทอรี" และ "โฟลเดอร์" คุณดูเหมือนจะใช้พวกเขาเพื่ออธิบายสิ่งต่าง ๆ
terdon

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

คำตอบ:


92

duนอกจากนี้คุณยังสามารถทำเช่นนี้มีเพียง เพื่อความปลอดภัยฉันใช้เวอร์ชั่นนี้du:

$ du --version
du (GNU coreutils) 8.5

วิธีการ:

$ du -ah ..DIR.. | grep -v "/$" | sort -rh

รายละเอียดของวิธีการ

คำสั่งที่จะผลิตรายการของทุกไฟล์และไดเรกทอรีในไดเรกทอรีที่กำหนดdu -ah DIR DIRความ-hประสงค์จะผลิตขนาดที่มนุษย์อ่านได้ซึ่งฉันชอบ หากคุณไม่ต้องการพวกเขาแล้วปล่อยสวิตช์นั้น ฉันใช้head -6เพียงเพื่อ จำกัด ปริมาณการส่งออก!

$ du -ah ~/Downloads/ | head -6
4.4M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K    /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M    /home/saml/Downloads/kodak_W820_wireless_frame
8.0K    /home/saml/Downloads/bugs.xls
604K    /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf

ง่ายพอที่จะจัดเรียงให้เล็กที่สุดถึงใหญ่ที่สุด

$ du -ah ~/Downloads/ | sort -h | head -6
0   /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock

กลับรายการใหญ่สุดไปหาน้อยที่สุด:

$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy

อย่าแสดงไดเรกทอรีเพียงไฟล์:

$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6 
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

ถ้าคุณเพียงต้องการรายการที่เล็กที่สุดที่ใหญ่ที่สุด แต่ไฟล์ด้านบน 6 กระทำผิดคุณสามารถย้อนกลับสลับเรียงลำดับลดลง ( -r) และใช้แทนtail -6head -6

$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G    /home/saml/Downloads/digital_blasphemy
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G    /home/saml/Downloads/apps_archive
3.8G    /home/saml/Downloads/audible
3.8G    /home/saml/Downloads/audible/audio_books

14
grep -v "/$"ส่วนหนึ่งไม่ได้ดูเหมือนจะทำสิ่งที่คุณคาดว่าจะเป็นไดเรกทอรีที่ไม่ได้มีการเฉือนท้าย ไม่มีใครรู้วิธีแยกไดเรกทอรีออกจากผลลัพธ์หรือไม่
Jan Warchoł

@ JanekWarchol - คุณใช้ coreutils รุ่นใดอยู่
slm

ฉันอายุ 8.13 แต่อย่างไรก็ตามผลลัพธ์ในคำตอบของคุณไม่มีส่วนท้าย/เช่นตัวอย่างเช่น/home/saml/Downloads/audibleดูเหมือนว่าเป็นไดเรกทอรี แต่ไม่มีเครื่องหมายทับ เพียง แต่/home/saml/Downloads/มีการเฉือน duแต่ที่อาจเป็นเพราะคุณเขียนมันด้วยการเฉือนเมื่อระบุอาร์กิวเมนต์สำหรับการเริ่มต้น
Jan Warchoł

1
สิ่งนี้พบว่า dirs ยัง
ekerner

1
สิ่งนี้ไม่เพียงแค่แสดงรายการไฟล์ แต่ยังแสดงรายการไดเรกทอรี :(
Roman Gaufman

20

หากคุณต้องการค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยและแสดงรายการไฟล์ตามขนาด (โดยไม่พิจารณาพา ธ ) และสมมติว่าไม่มีชื่อไฟล์ใดที่มีอักขระขึ้นบรรทัดใหม่ด้วย GNU findคุณสามารถทำได้ดังนี้:

find . -type f -printf "%s\t%p\n" | sort -n

จากman findบนระบบ GNU:

   -printf format
          True; print format  on  the  standard  output,
          interpreting  `\'  escapes and `%' directives.
          Field widths and precisions can  be  specified
          as  with the `printf' C function.  Please note
          that many of the  fields  are  printed  as  %s
          rather  than  %d, and this may mean that flags
          don't work as you  might  expect.   This  also
          means  that  the `-' flag does work (it forces
          fields to be  left-aligned).   Unlike  -print,
          -printf  does  not add a newline at the end of
          the string.  The escapes and directives are:

          %p     File's name.
          %s     File's size in bytes.

จากman sort:

   -n, --numeric-sort
          compare according to string numerical value

ใช้งานไม่ได้กับ Mac ขออภัยแสดง: ค้นหา: -printf: ไม่รู้จักผู้ให้บริการหลักหรือผู้ดำเนินการ
Roman Gaufman

@ RomanGaufman ใช่นั่นคือเหตุผลที่คำตอบระบุGNU find หากคุณติดตั้งเครื่องมือ GNU บน Mac ของคุณมันจะทำงานได้เช่นกัน
terdon

11

ลองคำสั่งต่อไปนี้:

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

มันจะแสดงรายการไฟล์ที่ใหญ่ที่สุด 20 อันดับแรกในไดเรกทอรีปัจจุบันซ้ำ

หมายเหตุ: ตัวเลือก-hสำหรับsortไม่พร้อมใช้งานบน OSX / BSD ดังนั้นคุณจะต้องติดตั้งsortจากcoreutils(เช่นผ่านbrew) และใช้เส้นทาง bin ท้องถิ่นกับPATHเช่น

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

หรือใช้:

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

สำหรับไดเรกทอรีที่ใหญ่ที่สุดใช้duเช่น:

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

หรือ:

du -a . | sort -rn | head -20

3
สมบูรณ์แบบนี่เป็นโซลูชั่นแรกที่ทำงานบน Mac และไม่แสดงไดเรกทอรี :) - ขอบคุณ!
Roman Gaufman

ตัวกรองจะแสดงเฉพาะไฟล์ที่มีจำนวนบรรทัด> = X อย่างไร (X = 0 สำหรับตัวอย่าง)
Matrix

7

นี่จะค้นหาไฟล์ทั้งหมดซ้ำและจัดเรียงตามขนาด มันพิมพ์ขนาดไฟล์ทั้งหมดเป็น kb และปัดเศษลงดังนั้นคุณอาจเห็นไฟล์ 0 KB แต่มันใกล้พอสำหรับการใช้งานของฉันและทำงานบน OSX

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1


ทำงานบน Ubuntu 14.04 ด้วย!
David Lam

รายการนี้ไดเรกทอรีไม่ใช่แค่ไฟล์ :(
Roman Gaufman

@ RomanGaufman - ขอบคุณสำหรับคำติชม! จากการทดสอบของฉันfind . -type fค้นหาไฟล์ ... มันทำงานซ้ำแล้วซ้ำอีกคุณพูดถูก แต่มันแสดงรายการไฟล์ทั้งหมดที่พบไม่ใช่ไดเรกทอรีตัวเอง
Brad Parks

Xargs ถูกนำมาใช้ในปี 1980 มันเป็นความคิดที่ไม่ดีมาตั้งแต่ปี 1989 เมื่อ David Korn ได้รับการแนะนำในเรื่องประมวลผลบวก
schily

5

ด้วยzshคุณจะพบไฟล์ที่ใหญ่ที่สุด (ในแง่ของขนาดที่ชัดเจนเช่นคอลัมน์ขนาดในls -lเอาต์พุตไม่ใช่การใช้ดิสก์) ด้วย:

ls -ld -- **/*(DOL[1])

สำหรับ 6 ตัวที่ใหญ่ที่สุด:

ls -ld -- **/*(DOL[1,6])

เพื่อจัดเรียงเหล่านั้นโดยขนาดไฟล์ที่คุณสามารถใช้lsของ-Sตัวเลือก lsการใช้งานบางอย่างยังมี-Uตัวเลือกที่lsจะไม่เรียงลำดับรายการ (เนื่องจากจัดเรียงตามขนาดแล้วzshที่นี่)


3

ทางออกง่าย ๆ สำหรับ Mac / Linux ที่ข้ามไดเรกทอรี:

find . -type f -exec du -h {} \; | sort -h


0

นี่เป็นความจำเป็นที่ต้องใช้ร่วมกันอย่างไม่น่าเชื่อด้วยเหตุผลหลายประการ (ฉันชอบค้นหาการสำรองข้อมูลล่าสุดในไดเรกทอรี) และเป็นงานที่ง่ายอย่างน่าประหลาดใจ

ฉันจะให้โซลูชัน Linux ที่ใช้ find, xargs, stat, tail, awk, และยูทิลิตี้การเรียงลำดับ

คนส่วนใหญ่ให้คำตอบที่ไม่ซ้ำกัน แต่ฉันชอบของฉันเพราะมันจัดการกับชื่อไฟล์ได้อย่างถูกต้องและกรณีการใช้งานสามารถเปลี่ยนแปลงได้อย่างง่ายดาย (แก้ไขสถิติและข้อโต้แย้งการเรียงลำดับ)

ฉันจะให้โซลูชัน Python ที่ให้คุณใช้ฟังก์ชันนี้ได้แม้ใน Windows

โซลูชันบรรทัดคำสั่ง Linux

ส่งคืนรายการทั้งหมดของไฟล์เฉพาะจากไดเรกทอรีซ้ำโดยเรียงลำดับตามขนาดไฟล์

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

เหมือนก่อนหน้านี้ แต่คราวนี้กลับไฟล์ที่ใหญ่ที่สุด

# Each utility is split on a new line to help 
# visualize the concept of transforming our data in a stream
find . -type f -print0 | 
xargs -0 -I{} stat -c '%s %n' {} | 
sort -n | 
tail -n 1 |
awk '{print $2}'

รูปแบบที่แน่นอนเหมือนกัน แต่ตอนนี้เลือกไฟล์ใหม่ล่าสุดแทนที่จะเป็นรูปแบบที่ใหญ่ที่สุด

# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} | 
sort -n | tail -n 1 | awk '{print $2}'

คำอธิบาย:

  1. find: ค้นหาไฟล์ทั้งหมดซ้ำจากไดเรกทอรีปัจจุบันซ้ำ ๆ และพิมพ์ออกมาด้วยอักขระ null
  2. xargs: ยูทิลิตี้เพื่อดำเนินการคำสั่งโดยใช้อาร์กิวเมนต์ที่มีให้จากอินพุตมาตรฐาน สำหรับทุกบรรทัดผลลัพธ์เราต้องการรันยูทิลิตี stat ในไฟล์นั้น
  3. stat: Stat เป็นคำสั่งที่ยอดเยี่ยมที่มีกรณีการใช้งานมากมาย ฉันพิมพ์สองคอลัมน์คอลัมน์แรกเป็นขนาดบล็อก (% s) และคอลัมน์ที่สองเป็นชื่อไฟล์ (% n)
  4. sort: เรียงลำดับผลลัพธ์ด้วยสวิตช์ตัวเลข เนื่องจากอาร์กิวเมนต์แรกเป็นจำนวนเต็มผลลัพธ์ของเราจะถูกจัดเรียงอย่างถูกต้อง
  5. tail: เลือกเฉพาะบรรทัดสุดท้ายของเอาต์พุต (เนื่องจากเรียงลำดับรายการนี่เป็นไฟล์ที่ใหญ่ที่สุด!)
  6. awk: เลือกคอลัมน์ที่สองซึ่งมีชื่อไฟล์และเป็นไฟล์ที่ใหญ่ที่สุดในไดเรกทอรีแบบเรียกซ้ำ

Python solution

#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
    for filename in filenames:
        realpath = os.path.join(dirpath, filename)
        files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)

สคริปต์นี้ใช้เวลาในการอธิบายนานกว่าเล็กน้อย แต่โดยหลักแล้วหากคุณบันทึกเป็นสคริปต์สคริปต์จะค้นหาอาร์กิวเมนต์แรกที่มีในบรรทัดคำสั่งและส่งคืนไฟล์ที่ใหญ่ที่สุดในไดเรกทอรีนั้น สคริปต์ไม่มีการตรวจสอบข้อผิดพลาด แต่ควรให้แนวคิดเกี่ยวกับวิธีการนี้ใน Python ซึ่งจะช่วยให้คุณมีแพลตฟอร์มที่ดีในการแก้ไขปัญหานี้



0

ลองคำสั่งด้านล่างพร้อมตัวเลือกการเรียงเพื่อให้โฟลเดอร์มีขนาดตามลำดับ

du -sh * | sort -sh


-1

สิ่งที่ทำงานบนแพลตฟอร์มใดก็ได้ยกเว้น AIX และ HP-UX คือ:

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