ลบไฟล์ซ้ำขนาดที่น้อยกว่า 1MB


13

ฉันจะลบไฟล์ที่มีขนาดน้อยกว่า 1MB ซ้ำจากไดเรกทอรีได้อย่างไร


คำตอบ:


21

สามารถทำได้ด้วยfind:

find . -type f -size -1M -exec rm {} +

โปรดทราบว่าการดำเนินการนี้จะซ้ำลงในไดเรกทอรีย่อยและจะลบไฟล์ทั้งหมดที่มีขนาดเล็กกว่า 1 เมกะไบต์โดยไม่มีเงื่อนไข ระวัง.


คุณไม่มีอาร์กิวเมนต์พา ธ ไปที่find

@Useless: นั่น findGNU :)
Sven Marnach

2
@DanielAndersson: findจำกัด จำนวนการขัดแย้งกับกระบวนการที่เรียกว่าให้พอดีกับขีด จำกัด ของระบบในทางตรงกันข้ามrm *ซึ่งเป็นสิ่งที่รับประกันว่าจะเป็นการเรียกใช้กระบวนการเดียว findจะเรียกใช้อินสแตนซ์หลายรายการrmหากจำเป็น และฉันค่อนข้างมั่นใจว่าอักขระพิเศษนั้นได้รับการปฏิบัติอย่างถูกต้องรวมถึงอักขระขึ้นบรรทัดใหม่ ฉันชอบเหตุผลที่มีความยืดหยุ่น-exec rmมากกว่า-delete- ตัวอย่างหลังนี้ไม่มีวิธีลบไฟล์ที่ป้องกันการเขียน
Sven Marnach

1
@Invoker: ฉันยกเลิกการเปลี่ยนแปลงของคุณเนื่องจากไม่ถูกต้อง -1Mหมายถึงน้อยกว่าหนึ่งเมกะไบต์ตามต้องการ เวอร์ชันของคุณจะลบไฟล์ทั้งหมดที่มีขนาดหนึ่งเมกะไบต์ซึ่งดูเหมือนว่าเป็นการดำเนินการที่ไม่มีจุดหมาย
Sven Marnach

2
สำหรับทุกคนที่สนใจถ้าคุณต้องการที่จะลบไฟล์ทั้งหมดมากกว่า 1M find . -type f -size +1M -exec rm {} +ใช้คำสั่ง บันทึก + 1M แทน -1M
chessofnerd

10

สิ่งนี้ควรทำงาน:

$ find <directory> -type f -size -1M -delete

ฉันไม่คิดว่าเราจะต้องใส่ยัติภังค์ในจาก 1M
Invoker

2
@ ผู้ตรวจสอบบัญชีฉันเชื่อว่า-เครื่องหมายเป็นเครื่องหมายลบหมายถึง "น้อยกว่า 1M" หากคุณเรียกใช้find <directory> -type f -size +1M -deleteคุณจะลบไฟล์ทั้งหมดที่มีขนาดใหญ่กว่า 1M
chessofnerd

ใช่คุณพูดถูกแล้ว
Invoker

2

เพื่อความหลากหลายและประสิทธิภาพที่เป็นไปได้ (อาจเล็กน้อย)

find <directory> -type f -size -1M -print0  | xargs -0 rm

มันควรจะเร็วขนาดไหน? มันเริ่มxargsกระบวนการเพิ่มเติม
Sven Marnach

ตอนนี้คุณสามารถมีซีพียูสองตัวต่อสู้กับอุปกรณ์บล็อกเดียวกัน! การดำเนินการทางสถิติ / readdir จะไม่ถูกบล็อกแบบซิงโครนัสโดยการยกเลิกการเชื่อมโยง ไม่ว่าจะเป็นเรื่องนี้จะดีขึ้นอย่างชัดเจนขึ้นอยู่กับขนาดทรีย่อยจำนวนไฟล์อุปกรณ์ ฯลฯ

1

ลอง

หา ขนาด -1M -exec rm {} \;


1
นี่เป็นสิ่งที่ยอดเยี่ยมสำหรับผู้ใช้ที่ไม่ใช่ GNU ขอบคุณ! เช่นเดียวกับคำตอบของ @ Sven แต่\;ในตอนท้ายแทนที่จะเป็น+
hamx0r

-1

คุณสามารถเช็คเอาต์ลิงค์นี้http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/มันมีสิ่งที่คุณต้องการ

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

คุณสามารถวนซ้ำไฟล์ทั้งหมดด้วย for for loop จากนั้นใช้ du และ awk เพื่อค้นหาขนาดไฟล์เหมือนในตัวอย่างด้านบน


รู้รอบบน SO ควรอยู่ในตัวเอง - อย่าโพสต์ลิงก์เพียงอย่างเดียว (นอกจากนี้รหัสในโพสต์ที่เชื่อมโยงจะลบไฟล์เปล่ามากกว่าไฟล์ที่เล็กกว่า 1M)
Sven Marnach

@SvenMarnach เราไม่สามารถใช้ $ file_size <1M ในลิงค์ตัวอย่างโค้ดที่ให้มา

1Mไม่มีเราไม่สามารถเนื่องจากเปลือกจะไม่เข้าใจ
Sven Marnach

โดย 1M ฉันหมายถึง 1048576 การแปลง 1MB เป็น byte

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