แสดงรายการไฟล์ที่มีขนาดใหญ่กว่า {size} เรียงตามวันที่


27

ฉันต้องการแก้ปัญหา 'ทำรายการไฟล์ล่าสุด 10 อันดับแรกในไดเรกทอรีปัจจุบันเกิน 20MB'

ด้วยlsฉันสามารถทำ:

ls -Shal |head

เพื่อรับไฟล์ที่ใหญ่ที่สุด 10 อันดับแรกและ:

ls -halt |head

เพื่อรับไฟล์ 10 อันดับล่าสุด

ด้วยการหาฉันสามารถทำได้:

find . -size +20M

หากต้องการแสดงรายการไฟล์ทั้งหมดเกิน 20MB ในไดเรกทอรีปัจจุบัน (และไดเรกทอรีย่อยซึ่งฉันไม่ต้องการ)

มีวิธีใดบ้างที่จะแสดงรายการไฟล์สิบไฟล์ล่าสุดที่มีขนาดใหญ่กว่าโดยเฉพาะควรใช้ls?

คำตอบ:


24

ตัวเลือก 'ไดเรกทอรีปัจจุบันสำหรับการมีfind -maxdepth 1commandline ทั้งหมดสำหรับความต้องการของคุณคือ:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

หรือ

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head

8

หมายเหตุ: สิ่งนี้จะใช้ได้กับ GNU-find แต่ไม่ใช่ทุกการค้นหาอื่น

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

เริ่มต้นเช่น @Rajish แต่ใช้printfคำสั่งจากfindเพื่อระบุรูปแบบเอาต์พุต มีรูปแบบที่เกี่ยวข้องกับเวลา 3 แบบคือatime, ctimeและmtime - %Tสำหรับ mtime %Aและ%Cสำหรับรูปแบบอื่น ๆ

@คือการระบุรูปแบบเวลาเป็นวินาทีตั้งแต่ยุค %fสำหรับชื่อไฟล์ขึ้น\nบรรทัดใหม่ระหว่าง 2 ไฟล์

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

ในที่สุดsedใช้เพื่อทิ้งข้อมูลเวลา

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


1
ถ้าคุณใช้file's คำสั่งอักขระพิเศษจะถูกพิมพ์เป็นตัวอักษรทับขวาหนี:-ls find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'นอกจากนี้รูปแบบจะมีลักษณะเช่นls -l, EoghanM ยังระบุไว้-lอยู่แล้ว
จัดการ

printfใช้งานได้เฉพาะสำหรับการแจกแจง GNU ที่ระบุเท่านั้น
Brethlosze

%T+สร้าง timestamps ที่มนุษย์สามารถอ่านได้เช่นเดียวกับ2018-11-06+13:37:54.4606466460ที่สามารถจัดเรียงโดยsort(โดยไม่มี-n) โปรดดู: unix.stackexchange.com/questions/29899/…
Ciro Santilli 新疆改造改造中心法轮功六四事件

5

zsh ของบ่น globให้ง่าย ผู้.คัดเลือกจะเลือกเฉพาะไฟล์ปกติLm+20เลือกไฟล์ที่มีขนาดอย่างน้อย 20MB บวกกับความยาวหนึ่งไบต์ ที่จะรวมไฟล์ที่ว่า 20MB L+20971519ยาวการใช้งาน จากนั้นomเรียงลำดับโดยการลดเวลาการแก้ไขและ[1,10]จำกัด การขยายเป็น 10 การแข่งขันแรก คุณยังต้องการ-tตัวเลือกlsหากคุณต้องการแสดงรายการไฟล์ตามวันที่; หรือคุณสามารถส่งไฟล์ไปยังคำสั่งอื่น (อายุน้อยที่สุด) หากต้องการส่งไฟล์ไปยังคำสั่งอื่นด้วยไฟล์ที่เก่าที่สุดก่อนใช้Omเพื่อจัดเรียงโดยเพิ่มเวลาการแก้ไขและ[-10,-1]เพื่อแยก 10 การแข่งขันล่าสุด

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])

2

ฉันคิดว่านี่อาจเป็นวิธีที่ดีกว่าในการแก้ปัญหา ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

เพื่อกำจัดข้อผิดพลาดใด ๆ ในขณะที่ค้นหาพยายามเข้าถึงไฟล์ที่คุณไม่ได้รับอนุญาตให้อ่านคุณอาจต้องการเพิ่ม

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 

1

การดำเนินการนี้จะพิมพ์เฉพาะไฟล์ 10 ไฟล์ที่ระบุโดยไม่คำนึงถึงอักขระบรรทัดใหม่ที่ฝังอยู่ในชื่อไฟล์ มันใช้ระบบไฟล์inodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done

-1

ขอบคุณสำหรับคำตอบทั้งหมด สิ่งที่ฉันได้จากไปคือ:

ls -halt | grep "M " |head

แม้ว่ามันจะลืม 20 เมกะไบต์เพื่ออะไรก็ได้มากกว่าเมกะไบต์ (และภายใต้กิกะไบต์) มันง่ายต่อการจดจำและรักษาองค์ประกอบที่มนุษย์สามารถอ่านได้ของขนาดไฟล์


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

เป็นเรื่องจริงฉันแน่ใจ แต่ในแง่ของผู้ใช้ที่เป็นมนุษย์ (และผลลัพธ์ที่ไม่ได้ถูกส่งไปยังที่อื่น ๆ ) อันนี้ง่ายต่อการจดจำเนื่องจากสามารถรวบรวมได้ง่ายขึ้นจากเครื่องมือง่ายๆที่รู้จักtldp.org/LDP/GNU-Linux- เครื่องมือ - สรุป / html / c1089.htm
EoghanM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.