ฉันต้องการค้นหาไฟล์ที่ใหญ่ที่สุดในโฟลเดอร์
ฉันจะสแกนโฟลเดอร์ซ้ำและเรียงลำดับเนื้อหาตามขนาดได้อย่างไร
ฉันได้ลองใช้ls -R -S
แต่มันแสดงรายการไดเรกทอรีเช่นกัน
ฉันก็ลองใช้find
ดู
ฉันต้องการค้นหาไฟล์ที่ใหญ่ที่สุดในโฟลเดอร์
ฉันจะสแกนโฟลเดอร์ซ้ำและเรียงลำดับเนื้อหาตามขนาดได้อย่างไร
ฉันได้ลองใช้ls -R -S
แต่มันแสดงรายการไดเรกทอรีเช่นกัน
ฉันก็ลองใช้find
ดู
คำตอบ:
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 -6
head -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
grep -v "/$"
ส่วนหนึ่งไม่ได้ดูเหมือนจะทำสิ่งที่คุณคาดว่าจะเป็นไดเรกทอรีที่ไม่ได้มีการเฉือนท้าย ไม่มีใครรู้วิธีแยกไดเรกทอรีออกจากผลลัพธ์หรือไม่
/
เช่นตัวอย่างเช่น/home/saml/Downloads/audible
ดูเหมือนว่าเป็นไดเรกทอรี แต่ไม่มีเครื่องหมายทับ เพียง แต่/home/saml/Downloads/
มีการเฉือน du
แต่ที่อาจเป็นเพราะคุณเขียนมันด้วยการเฉือนเมื่อระบุอาร์กิวเมนต์สำหรับการเริ่มต้น
หากคุณต้องการค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยและแสดงรายการไฟล์ตามขนาด (โดยไม่พิจารณาพา ธ ) และสมมติว่าไม่มีชื่อไฟล์ใดที่มีอักขระขึ้นบรรทัดใหม่ด้วย 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
ลองคำสั่งต่อไปนี้:
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
นี่จะค้นหาไฟล์ทั้งหมดซ้ำและจัดเรียงตามขนาด มันพิมพ์ขนาดไฟล์ทั้งหมดเป็น kb และปัดเศษลงดังนั้นคุณอาจเห็นไฟล์ 0 KB แต่มันใกล้พอสำหรับการใช้งานของฉันและทำงานบน OSX
find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1
find . -type f
ค้นหาไฟล์ ... มันทำงานซ้ำแล้วซ้ำอีกคุณพูดถูก แต่มันแสดงรายการไฟล์ทั้งหมดที่พบไม่ใช่ไดเรกทอรีตัวเอง
ด้วยzsh
คุณจะพบไฟล์ที่ใหญ่ที่สุด (ในแง่ของขนาดที่ชัดเจนเช่นคอลัมน์ขนาดในls -l
เอาต์พุตไม่ใช่การใช้ดิสก์) ด้วย:
ls -ld -- **/*(DOL[1])
สำหรับ 6 ตัวที่ใหญ่ที่สุด:
ls -ld -- **/*(DOL[1,6])
เพื่อจัดเรียงเหล่านั้นโดยขนาดไฟล์ที่คุณสามารถใช้ls
ของ-S
ตัวเลือก ls
การใช้งานบางอย่างยังมี-U
ตัวเลือกที่ls
จะไม่เรียงลำดับรายการ (เนื่องจากจัดเรียงตามขนาดแล้วzsh
ที่นี่)
ทางออกง่าย ๆ สำหรับ Mac / Linux ที่ข้ามไดเรกทอรี:
find . -type f -exec du -h {} \; | sort -h
เทียบเท่าในBSD
หรือOSX
เป็น
$ du -ah simpl | sort -dr | head -6
นี่เป็นความจำเป็นที่ต้องใช้ร่วมกันอย่างไม่น่าเชื่อด้วยเหตุผลหลายประการ (ฉันชอบค้นหาการสำรองข้อมูลล่าสุดในไดเรกทอรี) และเป็นงานที่ง่ายอย่างน่าประหลาดใจ
ฉันจะให้โซลูชัน Linux ที่ใช้ find, xargs, stat, tail, awk, และยูทิลิตี้การเรียงลำดับ
คนส่วนใหญ่ให้คำตอบที่ไม่ซ้ำกัน แต่ฉันชอบของฉันเพราะมันจัดการกับชื่อไฟล์ได้อย่างถูกต้องและกรณีการใช้งานสามารถเปลี่ยนแปลงได้อย่างง่ายดาย (แก้ไขสถิติและข้อโต้แย้งการเรียงลำดับ)
ฉันจะให้โซลูชัน Python ที่ให้คุณใช้ฟังก์ชันนี้ได้แม้ใน Windows
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}'
คำอธิบาย:
#!/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 ซึ่งจะช่วยให้คุณมีแพลตฟอร์มที่ดีในการแก้ไขปัญหานี้
แตกต่างของคำตอบนี้จากคำถามที่คล้ายกัน
find . -type f -exec du -ah {} + | sort -rh | more
ลองคำสั่งด้านล่างพร้อมตัวเลือกการเรียงเพื่อให้โฟลเดอร์มีขนาดตามลำดับ
du -sh * | sort -sh
สิ่งที่ทำงานบนแพลตฟอร์มใดก็ได้ยกเว้น AIX และ HP-UX คือ:
find . -ls | sort +6 | tail