Score:-2

รับขนาดรวมของไฟล์ที่ใหญ่ที่สุดห้าไฟล์ของฉันใน bash

ธง lr

ฉันกำลังพยายามหาขนาดรวมของไฟล์ที่ใหญ่ที่สุดห้าไฟล์ที่พบในไดเร็กทอรี แต่ฉันไม่สามารถทำงานในรายการของฉันได้ ฉันมีสองวิธีในการค้นหาและจัดเรียง ไฟล์ที่ใหญ่ที่สุดห้าไฟล์

#!/bin/bash

DIR=$1 #เส้นทางไดเร็กทอรีเริ่มต้น


ถ้า [ ! -d "$DIR" ]; จากนั้น #หากไม่พบไดเร็กทอรี
    echo "ไม่มีไดเร็กทอรี!" 
    ทางออก 1
ไฟ

echo "ห้าไฟล์ที่ใหญ่ที่สุดที่ใช้ ls คือ:"
test_ls=$( ls -lhR "$DIR" | grep '^-' | sort -r -k 5 -h | head -n 5 )
ดู่ -ch "$test_ls"


echo "ห้าไฟล์ที่ใหญ่ที่สุดที่ใช้ find/DU ได้แก่:"
test_find=$( ค้นหา "$DIR" -type f -exec du -ch {} + | sort -rh | head -n 5 )
du -ch "$test_find"

echo "จำนวนไฟล์ทั้งหมด: "
ls -lhR "$DIR" | เกรป '^-' | สุขา -l
echo "ขนาดไฟล์ทั้งหมด: "
du -sh "$DIR" | awk '{พิมพ์ $1}'

ถ้าฉันใช้ du กับตัวแปร ls ฉันจะได้รับ:

du: ตัวเลือกที่ไม่ถูกต้อง -- 'r'
du: ตัวเลือกที่ไม่ถูกต้อง -- 'w'
du: ตัวเลือกที่ไม่ถูกต้อง -- '-'
du: ตัวเลือกที่ไม่ถูกต้อง -- 'r'

และถ้าฉันใช้กับตัวแปร find ฉันจะได้รับสิ่งนี้สำหรับแต่ละไฟล์จากห้าไฟล์

du: ไม่สามารถเข้าถึง '429M': ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว

ทั้งรุ่น ls และรุ่น find ทำงานได้ดีสำหรับการแสดงรายการไฟล์ที่ใหญ่ที่สุดห้าไฟล์ภายใต้ไดเร็กทอรีที่กำหนด แต่ฉันหลงทางอย่างมากในการเพิ่มขนาดเข้าด้วยกัน

hr flag
จำเป็นต้องทุบตีหรือไม่? ตัวอย่างเช่น zsh shell สามารถจัดเรียงและเลือกไฟล์ตามขนาดได้โดยตรง เช่น `du -hc **/*(.NDOL[1,5])`
Score:1
ธง in

ไม่แน่ใจว่าจะแก้ไขโค้ดของคุณอย่างไรดีที่สุด ฉันจะเสนอแนวทางอื่นโดยไม่จำเป็นต้องใช้ ดู่ เช่น หา สามารถคืนขนาดไฟล์ด้วย -printf '%s'.

โปรดทราบว่า คุณไม่ควรแยกวิเคราะห์ และนั่น หา ไม่เหมือน จะทำงานซ้ำถ้าคุณไม่จำกัดที่ -ความลึกสูงสุด ตัวเลือก.


สิ่งนี้จะค้นหาไฟล์ที่ใหญ่ที่สุดห้าไฟล์ในไดเร็กทอรีและรวมขนาด:

ค้นหา "$DIR" -maxความลึก 1 -type f -printf '%s\n' | เรียงลำดับ -nr | หัว -n5 | วาง -sd+ | พ.ศ. | numfmt --to=iec
  • ค้นหา ... -printf '%s\n' จะพิมพ์ขนาดไฟล์เป็นไบต์
  • | เรียงลำดับ -nr | หัว -n5 จะพบจำนวนสูงสุดห้าตัว
  • | วาง -sd+ จะรวมตัวเลขด้วยเครื่องหมายบวกระหว่างตัวเลข ดังนั้นมันจึงเป็นนิพจน์ทางคณิตศาสตร์
  • | พ.ศ จะเรียกใช้นิพจน์ทางคณิตศาสตร์
  • | numfmt --to=iec (ไม่บังคับ) จะแปลงขนาดจากไบต์เป็นรูปแบบที่มนุษย์อ่านได้

หากต้องการข้อมูลเพิ่มเติม คุณสามารถบันทึก หา เอาต์พุตเช่น ในอาร์เรย์:

DIR=/บางคน/ผบ
file_sizes=($(ค้นหา "$DIR" -maxความลึก 1 -type f -printf '%s\n' | sort -nr))

num_files=${#file_sizes[@]}
total_size=$(IFS=+; echo "$((${file_sizes[*]}))" | numfmt --to=iec)
ใหญ่ที่สุด_ไฟล์=$(IFS=+; echo "$((${file_sizes[*]:0:5}))" | numfmt --to=iec)

printf 'จำนวนไฟล์ทั้งหมด: %d\nขนาดไฟล์ทั้งหมด: %s\nขนาดที่ใหญ่ที่สุด 5: %s\n' $num_files $total_size $biggest_files

โพสต์คำตอบ

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