ลบไฟล์ขนาด 0 ไบต์ผ่านทางบรรทัดคำสั่งหรือไม่


16

ดังนั้นฉันได้รับไดเรกทอรีที่เต็มไปด้วยไดเรกทอรีอื่น ๆ และฉันสงสัยว่ามันเป็นไปได้ที่จะลบไฟล์ที่ไม่มีขนาด โดยทั่วไปแล้วไฟล์เหล่านี้คือ 0 ไบต์และเนื่องจากฉันต้องการรวมส่วนย่อยทั้งหมดเหล่านี้ฉันสามารถแทนที่ไฟล์ Legit ที่สมบูรณ์แบบด้วยไฟล์น้ำหนัก 0 ไบต์และมีไฟล์ Legit ของฉัน มีวิธีใดที่จะลบไฟล์ศูนย์ไบต์?

คำตอบ:


34

ใช้คำสั่งค้นหาเพื่อค้นหาไฟล์ตามขนาดและพิมพ์ชื่อไฟล์ไปยังเอาต์พุตมาตรฐาน

find . -type f -size 0b -print

แทนที่-printด้วย-deleteเพื่อลบไฟล์แทนที่จะพิมพ์บนหน้าจอ

find . -type f -size 0b -delete

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

เสียงเหมือนงานสำหรับrsync

7
คุณสามารถใช้แทน-empty -size 0b
Kevin

6

ค้นหาและลบไฟล์ทั้งหมดด้วยขนาด 0 ซ้ำ:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

ตัวอย่าง:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo

4

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

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

คำอธิบาย

  • shopt -s globstar: เปิดใช้ตัวเลือก globstar สำหรับการทุบตีซึ่งทำให้**ตรงกับหนึ่งหรือมากกว่าไดเรกทอรีย่อย **/*จะจับคู่ไฟล์และไดเรกทอรีทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยทั้งหมด
  • for file in **/*; do ...; done : ซ้ำทุกไฟล์และไดเรกทอรีที่พบ;
  • [ ! -s "$file" ]: [ -s "$file" ]เป็นจริงถ้าไฟล์นั้นมีอยู่และไม่ว่างเปล่า ดังนั้น[ ! -s "$file" ](ผู้!ทดสอบทำการทดสอบ) จึงเป็นจริงหากไฟล์ไม่มีอยู่หรือว่างเปล่า
  • [ -f "$file" ]: จริงถ้าไฟล์เป็นไฟล์ปกติ ไม่ใช่ไดเรกทอรีหรือไฟล์อุปกรณ์หรือ symlink เป็นต้น
  • rm "$file" : ลบไฟล์

&&มั่นใจว่าคำสั่งต่อไปคือการเรียกใช้เฉพาะในกรณีที่ก่อนหน้านี้หนึ่งจนประสบความสำเร็จนี้จะลบว่างไฟล์ปกติ


และฉันคิดว่าคำตอบของฉันซับซ้อน :) +1
AB

2

แม้ว่าคำตอบส่วนใหญ่จะถูกต้อง แต่ให้มองหาคำสั่งนี้

ไฟล์ขนาด 0 ไบต์หมายถึงไฟล์ว่าง

แม้ว่าคุณจะสามารถรันคำสั่งนี้:

find . -type f -empty -delete

จะเป็นการลบไฟล์ที่ว่างเปล่าทั้งหมด

คุณสามารถดูไฟล์เหล่านั้นก่อนที่จะลบ:

find . -type f -empty

บน Ubuntu 14.04 LTS โดยไม่-type f, -emptyจะลบไดเรกทอรีว่าง เพียงแค่ตรวจสอบหน้าคน
Bulrush
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.