Câu trả lời:
Đ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.
find
. :)
find
giớ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. find
sẽ gọi nhiều thể hiện rm
nế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 rm
hơn -delete
vì 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.
-1M
có 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.
find . -type f -size +1M -exec rm {} +
. Lưu ý + 1M thay vì -1M.
Điều này sẽ làm công việc:
$ find <directory> -type f -size -1M -delete
-
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 -delete
bạn sẽ xóa tất cả các tệp lớn hơn 1M.
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
xargs
quá trình bổ sung .
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.
1M
.