Loại bỏ đệ quy các tệp có kích thước nhỏ hơn 1MB


Câu trả lời:


21

Điều này có thể được thực hiện với find:

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

Lưu ý rằng điều này sẽ đệ quy xuống các thư mục con và sẽ xóa vô điều kiện tất cả các tệp nhỏ hơn 1 megabyte. Hãy cẩn thận.


bạn đang thiếu đối số đường dẫn đếnfind

@ Vô dụng: Đó là GNU find. :)
Sven Marnach

2
@DanielAndersson: findgiới hạn số lượng đối số cho quy trình được gọi để phù hợp với giới hạn của hệ thống, ngược lại rm *, được đảm bảo là một yêu cầu quy trình duy nhất. findsẽ gọi nhiều thể hiện rmnếu cần thiết. Và tôi khá chắc chắn rằng các ký tự đặc biệt được xử lý chính xác, bao gồm các ký tự dòng mới. Tôi thích -exec rmhơn -deletevì lý do linh hoạt - như một ví dụ, cái sau cung cấp không có cách nào để xóa các tệp được bảo vệ ghi.
Sven Marnach

1
@Invoker: Tôi đã hoàn nguyên thay đổi của bạn vì nó không chính xác. -1Mcó nghĩa là ít hơn một megabyte như mong muốn. Phiên bản của bạn sẽ xóa tất cả các tệp có kích thước chính xác một megabyte, đây dường như là một hoạt động hơi vô nghĩa.
Sven Marnach

2
Đối với bất kỳ ai quan tâm, nếu bạn muốn xóa tất cả các tệp lớn hơn 1M, hãy sử dụng lệnh find . -type f -size +1M -exec rm {} +. Lưu ý + 1M thay vì -1M.
cờ vua

10

Điều này sẽ làm công việc:

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

Tôi không nghĩ rằng chúng ta cần phải gạch nối từ 1M.
Invoker

2
@Invoker, tôi tin rằng -dấu này là dấu trừ có nghĩa là "dưới 1M". Nếu bạn chạy, find <directory> -type f -size +1M -deletebạn sẽ xóa tất cả các tệp lớn hơn 1M.
cờ vua

vâng, bạn đúng là xấu của tôi
Invoker

2

Chỉ dành cho sự đa dạng và hiệu suất có thể (có thể là cận biên):

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

Làm thế nào điều này được cho là nhanh hơn? Nó bắt đầu một xargsquá trình bổ sung .
Sven Marnach

Bây giờ bạn có thể có hai CPU cạnh tranh cho cùng một thiết bị khối! Một cách hợp lý hơn, các hoạt động stat / readdir không bị chặn đồng bộ bởi hoạt động hủy liên kết. Việc này có khả năng tốt hơn hay không rõ ràng phụ thuộc vào kích thước cây con, số lượng tệp, thiết bị, v.v.

1

Thử

tìm thấy . -size -1M -exec rm {} \;


1
Điều này rất tốt cho người dùng không phải GNU. Cảm ơn! giống như câu trả lời của @ Sven, nhưng \;cuối cùng thay vì+
hamx0r

-1

Bạn có thể kiểm tra liên kết này http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , nó có chính xác những gì bạn muốn.

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

Bạn có thể lặp qua tất cả các tệp bằng một vòng lặp for và sau đó sử dụng du và awk để tìm kích thước tệp như trong ví dụ trên.


Câu trả lời về SO nên được khép kín - không đăng một liên kết đơn thuần. (Hơn nữa, mã trong bài đăng được liên kết sẽ xóa các tệp trống thay vì các tệp nhỏ hơn 1M.)
Sven Marnach

@SvenMarnach chúng ta không thể sử dụng $ file_size <1M trong liên kết ví dụ mã đã cho.

Không, chúng tôi không thể, vì vỏ sẽ không hiểu 1M.
Sven Marnach

Bởi 1M tôi có nghĩa là 1048576 chuyển đổi 1MB thành byte

1
Chà, nếu bạn kiểm tra xem điều này có thực sự hiệu quả không và sao chép mã vào câu trả lời của bạn, thì đây có thể trở thành câu trả lời SO.
Sven Marnach
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.