Cách xóa các tệp cũ hơn X giờ


191

Tôi đang viết một tập lệnh bash cần xóa các tập tin cũ.

Nó hiện đang được thực hiện bằng cách sử dụng:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

Điều này sẽ xóa các tập tin cũ hơn 1 ngày.

Tuy nhiên, nếu tôi cần độ phân giải tốt hơn trong 1 ngày, nói như 6 giờ thì sao? Có một cách sạch đẹp để làm điều đó, như có sử dụng find và -mtime không?

Câu trả lời:


303

Bạn find-mminlựa chọn không? Điều đó có thể cho phép bạn kiểm tra số phút kể từ lần sửa đổi cuối cùng:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

Hoặc có thể nhìn vào việc sử dụng tmpwatchđể làm công việc tương tự. phjr cũng đề nghị tmpreapertrong các ý kiến.


2
Sử dụng --mmin + X trả về tất cả các tệp mà tôi tìm thấy. Lỗi của tôi vì đã không kiểm tra cái này trước, nhưng lệnh này chỉ xóa hầu hết thư mục nhà của tôi. Đối với tôi, --mmin -X là đối số chính xác.
brandones

tmpreaper là một nhánh của tmpwatch. Nó an toàn hơn, và tồn tại như một gói debian trong bản phân phối. Lợi ích của việc tìm kiếm -delete: tmpreaper sẽ không xóa các liên kết tượng trưng, ​​ổ cắm, fifos hoặc các tệp đặc biệt
Nadir

Chỉ ra rằng $ REQUIRED_FILES cần được đặt trong dấu ngoặc kép (dấu ngoặc kép) và bạn có thể sử dụng một mẫu như: " .txt" cho tất cả các tệp .txt hoặc tệp bắt đầu bằng một mẫu như: "temp- " để xóa tất cả các tệp có tên temp -
achasinh

@PaulDixon làm thế nào để sửa đổi này để $LOCATION$REQUIRED_FILEScả hai có thể có nhiều giá trị như dir1 dir2*.txt *.tmp?
Enissay

@Enissay $ VỊ TRÍ là một thư mục duy nhất. Đối với nhiều tiện ích mở rộng, bạn có thể muốn sử dụng một mẫu với -regex - xem stackoverflow.com/questions/5249779/
Paul Dixon

9

Bạn có thể thực hiện thủ thuật này: tạo tệp 1 giờ trước và sử dụng -newer fileđối số.

(Hoặc sử dụng touch -tđể tạo một tập tin như vậy).


1
không có công tắc hàn nào (ít nhất là trong lệnh find của tôi), và đó là điều cần thiết. -newer không giúp đỡ.
iconoclast

bạn có thể đưa ra một lệnh cảm ứng sẽ tạo ra một tệp cũ 1 giờ sẽ hoạt động trên các máy không thể sử dụng -mmin không? (Nếu bạn đang dùng Linux, -mmin có sẵn, nếu không thì ngày và các lệnh khác cũng yếu hơn so với.)
iconoclast

2
@iconoclast touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) testTạo tập tin testluôn luôn 1 giờ.
rovr138

4

Đây là cách tiếp cận hiệu quả với tôi (và tôi không thấy nó được sử dụng ở trên)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

xóa tất cả các tệp cũ hơn 59 phút trong khi vẫn giữ nguyên các thư mục.


Tốt hơn là trích dẫn đơn '*.*'hoặc shell sẽ mở rộng nó thành tên tệp thực tế thay vì giữ nó làm ký tự đại diện findđể giải quyết. Điều này phá vỡ findhoạt động đệ quy trên các thư mục con.
MestreLion

Cũng nên nhớ rằng -name '*.*'sẽ không xóa các tập tin mà không có phần mở rộng, chẳng hạn như README, Makefilevv
MestreLion

1

Dành cho SunOS 5.10

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.

0

-mmin là trong vài phút.

Hãy thử nhìn vào trang người đàn ông.

man find

cho nhiều loại


0

Nếu bạn không có "-mmin" trong phiên bản "tìm" của mình, thì "-mtime -0.041667" sẽ khá gần với "trong vòng một giờ qua", vì vậy, trong trường hợp của bạn, hãy sử dụng:

-mtime +(X * 0.041667)

vì vậy, nếu X có nghĩa là 6 giờ, thì:

find . -mtime +0.25 -ls

hoạt động vì 24 giờ * 0,25 = 6 giờ


Là hy vọng bởi vì UNIX cũ này không có -mmin, nhưng, thật đáng buồn này là không có sự giúp đỡ như UNIX cũ này cũng không giống như các giá trị phân đoạn cho mtime: tìm: đối số để -mtime phải là số nguyên trong khoảng từ -2147483647 đến 2147483647
kbulgrien

0

Đây là những gì người ta có thể làm cho đi trên con đường @iconoclast đã tự hỏi về trong họ bình luận về câu trả lời khác.

sử dụng crontab cho người dùng hoặc /etc/crontabtạo tệp /tmp/hour:

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

và sau đó sử dụng lệnh này để chạy lệnh của bạn:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;

*/1cho hàng giờ là dư thừa trong crontab của bạn. Nó giống như đặt * trong trường giờ.
colm.anseo

0

find $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;


0

Nếu ai findđó không có -mminvà nếu một người cũng bị mắc kẹt với findchỉ chấp nhận các giá trị nguyên cho -mtimethì tất cả không nhất thiết bị mất nếu người ta cho rằng "cũ hơn" tương tự như "không mới hơn".

Nếu chúng tôi có thể tạo một tệp có thời gian giới hạn, chúng tôi có thể yêu cầu findxác định vị trí các tệp "không mới hơn" tệp tham chiếu của chúng tôi.

Để tạo một tập tin mà có tem thời gian chính xác là một chút tham gia vì một hệ thống mà không có đầy đủ findcó lẽ cũng có một ít hơn khả năng datelệnh mà có thể làm những việc như: date +%Y%m%d%H%M%S -d "6 hours ago".

May mắn thay, các công cụ cũ khác mà có thể quản lý này, mặc dù theo một cách khó sử dụng hơn.

Hãy xem xét rằng sáu giờ là 21600 giây. Chúng tôi muốn tìm thời gian sáu giờ trước theo định dạng hữu ích:

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

Câu lệnh perl đã tạo ra một ngày hữu ích, nhưng nó phải được đưa vào sử dụng tốt hơn:

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

Bây giờ giải pháp cho UNIX cũ này là một cái gì đó dọc theo dòng:

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

Nó cũng có thể là một ý tưởng tốt để làm sạch tệp tham chiếu của chúng tôi ...

$ rm -f ref_file
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.