Xóa các tệp có phạm vi kích thước nhất định


12

Tôi muốn xóa các tập tin có kích thước nằm giữa các giá trị nhất định. Ví dụ tôi có danh sách các tập tin sau:

-rw-r--r-- 1 smsc sys  558 Apr 30 13:07 stats.sfe.1.20120430130513.xml.Z
-rw-r--r-- 1 smsc sys  388 Apr 30 15:32 stats.sfe.1.20120430153013.xml.Z
-rw-r--r-- 1 smsc sys  386 Apr 30 15:36 stats.sfe.1.20120430153513.xml.Z
-rw-r--r-- 1 smsc sys  389 Apr 30 15:42 stats.sfe.1.20120430154013.xml.Z
-rw-r--r-- 1 smsc sys  390 Apr 30 16:02 stats.sfe.1.20120430160013.xml.Z
-rw-r--r-- 1 smsc sys  385 Apr 30 16:12 stats.sfe.1.20120430161013.xml.Z

Từ danh sách trên, tôi muốn chỉ xóa các tệp có kích thước khác nhau trong khoảng từ 386b đến 390b . Tôi biết rằng tôi có thể sử dụng lệnh sau để xóa các tệp có kích thước vượt quá mức nhất định <size>:

find . -size +<size>-delete

Nhưng làm cách nào tôi có thể thêm một ranh giới nữa cho các tệp có kích thước nhỏ hơn một giá trị đã cho?


4
findđiều kiện là logic VÀ'd theo mặc định, vì vậy chỉ cần -sizegiải quyết tùy chọn khác cho ràng buộc khác.
jw013

@ jw013 Tuyệt vời! Nó ổn với tôi. Cảm ơn! Xin vui lòng gửi nó như là câu trả lời của bạn và tôi sẽ chấp nhận nó.
Eugene S

Câu trả lời:


7

Một phạm vi chỉ đơn giản là một giới hạn trên một giới hạn dưới. Từ findthông số kỹ thuật :

biểu thức [-a] biểu thức

Kết hợp bầu cử sơ bộ; toán tử AND được ngụ ý bởi vị trí kề nhau của hai nguyên hàm hoặc được làm rõ bởi toán tử -a tùy chọn. Biểu thức thứ hai sẽ không được đánh giá nếu biểu thức đầu tiên là sai.

Vì vậy, tất cả những gì bạn cần làm là chỉ định cả hai giới hạn kích thước trước khi -deletehành động.


8

Các -atrong một rõ ràng ANDđiều hành cho phép bạn nối tiếp hai bầu cử sơ bộ. Trong trường hợp này tạo ra một phạm vi sử dụng -size.

find . -size +386b -a -size -390b -exec rm -f {} \;

Lưu ý kích thước là một đối số số tùy ý có thể được thêm vào trước +-. Từ man 1 find:

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.

Cảm ơn về câu trả lời của bạn. Tuy nhiên, như @ jw013 đã đề cập trong bình luận của mình, các findđiều kiện được mặc định VÀ theo mặc định. Vì vậy, tôi chỉ cần thêm một sizeđiều kiện và nó hoạt động tốt! Lệnh cuối cùng trông giống như:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S

7

Bất cứ khi nào findmong đợi một số, bạn có thể đặt một +dấu hiệu trước nó có nghĩa nhiều hơn số này hoặc một -dấu hiệu có nghĩa ít hơn số này. Đây là những bất bình đẳng nghiêm ngặt: +3-7có nghĩa là 4, 5 hoặc 6.

Với -sizechính, bạn cần thêm hậu tố cđể chỉ ra rằng số đó là một số byte. Bạn có thể ghép nhiều nguyên tắc để kết hợp chúng (trong một số phiên bản, bạn có thể đặt -ahoặc -andgiữa chúng). Như vậy:

find . -size +385c -size -391c -delete

Trong zsh, bạn có thể sử dụng L vòng loại toàn cầu . Đơn vị mặc định là byte; như find, các nhân vật +-chỉ ra sự bất bình đẳng nghiêm ngặt.

rm *(L+385-391)

(Lệnh trên không lặp lại thành các thư mục con; nếu bạn cần điều đó, hãy thêm vào **/trước mẫu.)


Tôi không hiểu +3 và -7 bằng 4, 5 hoặc 6. Bạn có thể giải thích?
Hashim

1

Một cách sử dụng perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *

Cảm ơn về câu trả lời của bạn! Phần mã này có nên được nhập dưới dạng một dòng không?
Eugene S

@EugeneS: Vâng. Nó nên hoạt động để dán nó trong dòng lệnh của bạn nguyên trạng hoặc nối tất cả các dòng thành một.
Birei
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.