Bối rối bởi lệnh `find` này trong tập lệnh Bash?


8

Tôi có một tập lệnh bash, được tạo bởi một người không còn khả năng giải thích ý nghĩa, được sử dụng để tự động TARing một thư mục và sao lưu nó. Hiện tại tôi đang bối rối với dòng cuối cùng:

find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

Kịch bản đầy đủ dưới đây.

#!/bin/bash
#Purpose = Backup of Important Data
#Created on 17-1-2012
#Author = Hafiz Haider
#Version 1.0
#START
TIME=$(date +"%m-%d-%Y-%T")
FILENAME=pokebrawl-$TIME.tar.gz
SRCDIR=/home/servers/brawl/world
DESDIR=/home/_backups/pokebrawl
tar -cpzf $DESDIR/$FILENAME $SRCDIR
find '/home/_backups/pokebrawl' -mtime +6 -type f -delete
#END

3
Không có câu hỏi tiếp theo, một câu hỏi cho mỗi câu hỏi. Bạn có thể hỏi bao nhiêu câu hỏi tùy thích. Vì vậy, nhấp vào hỏi câu hỏi, sau đó hỏi một câu hỏi khác, đừng thêm nó vào dưới cùng của câu hỏi khác.
ctrl-alt-delor

Câu trả lời:


11

Các findlệnh sẽ xóa bất kỳ tập tin thường xuyên trong hoặc dưới các /home/_backups/pokebrawlthư mục đó là hơn bảy ngày tuổi (hay chính xác hơn, không bị sửa đổi trong tuần trước).

lẽ nên đọc

find "$DESDIR" -mtime +6 -type f -delete

hoặc là

find "${DESDIR:?Not set correctly}" -mtime +6 -type f -delete

vì có một biến hoàn toàn tốt giữ tên thư mục đó rồi. Biến thể thứ hai sẽ gây ra lỗi nếu DESDIRvì một lý do nào đó trống hoặc không được đặt.

Tôi cho rằng đây là cách chỉ giữ lại các bản sao lưu giá trị của tuần trước. Tôi sẽ đề nghị sử dụng một cái gì đó giống borgbackuphoặc resticthay vào đó, vì chúng có thể giữ các bản sao lưu lâu hơn mà không cần sử dụng nhiều dung lượng hơn (thậm chí các bản sao lưu hàng giờ trong một năm sẽ không tốn nhiều dung lượng nếu dữ liệu không thay đổi nhiều) . Chúng sao chép dữ liệu và borgbackuphỗ trợ nén (cả hỗ trợ sao lưu từ xa và mã hóa).

Để chạy tập lệnh cứ sau 24 giờ (lúc nửa đêm), hãy sử dụng công việc định kỳ.

Đầu tiên, ban hành lệnh crontab -e. Điều này sẽ mở một trình soạn thảo với crontab hiện tại cho người dùng đang hoạt động (đây có thể là một tệp trống).

Sau đó thêm

@daily /path/to/the/script.sh

(nơi path/to/the/script.shlà tên đường dẫn của tập lệnh).

Lưu và thoát khỏi trình soạn thảo.

Kịch bản bây giờ sẽ được gọi vào lúc nửa đêm, thậm chí đêm.

Bạn có muốn chạy tập lệnh vào lúc 13:30 mỗi chiều, thêm đoạn sau đây làm mục crontab thay thế:

30 13 * * * /path/to/the/script.sh

Xem hướng dẫn sử dụng crontab trên hệ thống của bạn để biết chi tiết về cách viết lịch trình crontab ( man 5 crontab).


1
Về khía cạnh Có lẽ nên đọc : Tôi đã thấy một số người viết kịch bản cố tình tránh sử dụng biến môi trường khi thực hiện loại find/ deletethao tác này, trong trường hợp một số doofus quên đặt $DESDIRhoặc đặt thành "/" hoặc somesuch do nhầm lẫn.
steve

@steve Vâng, nếu DESDIRđược thay đổi và findlệnh không được cập nhật, nó sẽ không dọn sạch thư mục chính xác. Nó có thể hữu ích để sử dụng ${DESDIR:?Not set correctly}hoặc một cái gì đó tương tự thay thế.
Kusalananda

5
find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

Điều này tìm thấy tất cả các tệp trong thư mục /home/_backups/pokebrawlchưa được sửa đổi trong những +6ngày qua và xóa chúng. LƯU Ý: +6tương đương với 7 ngày.

Nhìn vào man findđể xem các công tắc này hoạt động như thế nào:

$ man find
...
   -mtime n
          File's data was last modified n*24 hours ago.  See the comments 
          for -atime to understand how rounding affects the interpretation 
          of file modification times.

Trên các bản phân phối Redhat, bạn có thể chỉ cần đặt tập lệnh này vào thư mục /etc/crondailyvà nó sẽ chạy mỗi ngày. Bạn có thể thấy rằng đã có các tập lệnh khác mà bạn có thể sử dụng làm ví dụ:

$ sudo ls -l /etc/cron.daily/
total 12
-rwx------. 1 root root 219 Aug  1  2017 logrotate
-rwxr-xr-x. 1 root root 618 Mar 17  2014 man-db.cron
-rwx------. 1 root root 208 Nov  4  2016 mlocate
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.