Điểm:2

Tập lệnh Bash: Xóa các tệp cũ hơn một cách có điều kiện trong khi vẫn giữ các bản sao mới nhất

lá cờ kp

Lưu ý: Mặc dù có câu trả lời từ jeff-schaller, nhưng nó phụ thuộc vào zsh; vì vậy tôi muốn nhận được câu trả lời dựa trên Bash.

Tôi muốn tạo một tập lệnh Bash để xóa các tệp cũ hơn một cách có điều kiện khỏi thư mục sao lưu.

Có 2 điều kiện để sao lưu 2 tệp riêng biệt:

1, Giữ bản sao mới nhất của Edge_Profile_*.tgz, và xóa phần còn lại của Edge_Profile_*.tgz chỉ khi chúng cũ hơn 5 ngày.

2, Giữ bản sao mới nhất của Firefox_Profile_*.tgz, và xóa phần còn lại của Firefox_Profile_*.tgz, không quan trọng họ bao nhiêu tuổi.

Đây là cách tôi sửa đổi câu trả lời AskUbfox này: https://askubuntu.com/a/933098/928088

Kịch bản:

#!/bin/bash

LOG_FILE="/home/admn/Cleanup.log"
TEMP_LOG="/tmp/Temp_Cleanup.log"

mv $LOG_FILE $TEMP_LOG

{

cd /home/admn/Downloads/Test;

echo "Nhật ký dọn dẹp:" `date`

find /home/admn/Downloads/Test/Edge_Profile_*.tgz -type f \( -mtime +5 -printf 'Y\t' -o -printf 'N\t' \) -printf '%A@\t% p\0' |
    sắp xếp -zk2,2 | đầu -zn -1 | trong khi đọc -r -d '' cờ _ tập tin; làm \
        trường hợp "$flag" trong 
            'Y') echo rm "$file" 
               ;; 
            *) tiếng vang "bỏ qua tệp $ (quá mới)"
               ;; 
        esac;
xong

tiếng vang

tìm /home/admn/Downloads/Test/Firefox_Profile_*.tgz -type f \( -printf 'Y\t' -o -printf 'N\t' \) -printf '%A@\t%p\0' |
    sắp xếp -zk2,2 | đầu -zn -1 | trong khi đọc -r -d '' cờ _ tập tin; làm \
        trường hợp "$flag" trong 
            'Y') echo rm "$file" 
               ;; 
            *) tiếng vang "bỏ qua tệp $ (quá mới)"
               ;; 
        thoát hiểm        
xong

} &>> $LOG_FILE

con mèo $TEMP_LOG >>$LOG_FILE

lối ra;

Đầu ra trong logfile với tiếng vang:

/usr/local/scripts/cleanup.sh

rm /home/admn/Downloads/Test/Edge_Profile_Jul_06_2021_00-35.tgz
rm /home/admn/Downloads/Test/Edge_Profile_Jul_07_2021_00-35.tgz
....
bỏ qua /home/admn/Downloads/Test/Edge_Profile_Jul_12_2021_00-35.tgz (quá mới)
bỏ qua /home/admn/Downloads/Test/Edge_Profile_Jul_13_2021_00-35.tgz (quá mới)
....

rm /home/admn/Downloads/Test/Firefox_Profile_Jul_01_2021_00-35.tgz
rm /home/admn/Downloads/Test/Firefox_Profile_Jul_02_2021_00-35.tgz
....

Đầu ra trong tệp nhật ký trong khi thực sự chạy tập lệnh mà không cần tiếng vang:

/home/admn/Downloads/cleanup.sh: dòng 24: bỏ qua /home/admn/Downloads/Test/Edge_Profile_Jul_12_2021_00-35.tgz (quá mới): Không có tệp hoặc thư mục như vậy
/home/admn/Downloads/cleanup.sh: dòng 24: bỏ qua /home/admn/Downloads/Test/Edge_Profile_Jul_13_2021_00-35.tgz (quá mới): Không có tệp hoặc thư mục như vậy
....

Tổng số file trong thư mục: 20 file

1, Edge_Profile_*.tgz: Từ 06/07 đến 17/07: 12 file

2, Firefox_Profile_*.tgz: Từ 01/07 đến 08/07: 8 file

các vấn đề:

(1) tôi nghĩ kịch bản đang hoạt động nhưng tôi không chắc vì tôi đã sửa đổi hầu hết các phần mà không biết chuyện gì đang xảy ra.

(2) Xuất ra logfile:

Tôi thích đầu ra chính xác giống như vậy trong tệp nhật ký mà tôi nhận được tiếng vang, ngoại trừ tên tệp (không có đường dẫn đầy đủ), như:

rm Edge_Profile_Jul_11_2021_00-35.tgz

bỏ qua Edge_Profile_Jul_12_2021_00-35.tgz (quá mới)

Hệ điều hành: Ubuntu MATE 21.04

Cảm ơn rất nhiều.

Điểm:1
lá cờ ru

Thao tác với các tệp dựa trên thời gian sửa đổi của chúng sẽ dễ dàng hơn nhiều trong trình bao cho phép bạn truy cập chúng trực tiếp. zsh là một shell như vậy. Đơn giản sudo apt cài đặt zsh để cài đặt nó. Vì các tệp của bạn dường như nằm trong một thư mục nên câu trả lời này không được đệ quy. Chứng minh trường hợp đơn giản hơn trước:

  • Để giữ bản sao mới nhất của Firefox_Profile_*.tgz và xóa phần còn lại của chúng cho dù chúng bao nhiêu tuổi:

    echo sẽ rm -v -- Firefox_Profile_*.tgz(.om[2,-1])
    

    Gỡ bỏ tiếng vang sẽ phần nếu nó có vẻ chính xác. Điều này sử dụng một vòng loại toàn cầu (ký tự đại diện) bên trong dấu ngoặc đơn để làm ba việc:

    • chỉ chọn các tệp đơn giản (không phải thư mục hoặc ổ cắm, v.v.) với .
    • sắp xếp (sắp xếp) các tệp theo thời gian sửa đổi của chúng, mới nhất đến cũ nhất, với om
    • chọn một phần của danh sách kết quả bắt đầu từ phần tử thứ hai đến hết -- bỏ qua tệp đầu tiên (mới nhất), với [2,-1]

    Nếu không có tệp phù hợp, zsh sẽ dừng và phàn nàn với "zsh: không tìm thấy kết quả phù hợp" và sẽ không thực thi rừm.

  • Để giữ bản sao mới nhất của Edge_Profile_*.tgz và chỉ xóa phần còn lại nếu chúng cũ hơn 5 ngày, trước tiên chúng tôi lấy bản mới nhất:

    mới nhất=(Edge_Profile_*.tgz(.om[1]))
    

    ... và sau đó chúng tôi nhận được những cái cũ hơn năm ngày:

    cũ hơn=(Edge_Profile_*.tgz(.m+5))
    

    Phần mới ở đây là +5 trên tôi bổ nghĩa. Điều đó chọn các tệp cũ hơn 5 ngày. Sau đó, chúng tôi đảm bảo rằng cái mới nhất không có trong danh sách cần xóa:

    xóa=("${(@)cũ hơn:|mới nhất}")
    

    Phần mới ở đây là ký hiệu phép trừ mảng :|; nó được ghi lại trong Phần mở rộng tham số của sổ tay zsh. Nó chọn các phần tử của "cũ hơn" không có trong "mới nhất". Cuối cùng, chúng tôi xóa danh sách các tệp đó:

    echo sẽ rm -v -- "${remove[@]}"
    
Jags avatar
lá cờ kp
Cảm ơn bạn đã trả lời, nhưng tôi thích sử dụng `Bash`. 'Vì lần trước khi tôi cài đặt `zsh`, tôi đã định dạng và cài đặt sạch.
Jeff Schaller avatar
lá cờ ru
Bạn không cần phải sử dụng nó như vỏ bọc hàng ngày của mình; chỉ cần cài đặt nó và sử dụng nó cho tập lệnh này.
Jags avatar
lá cờ kp
ồ được rồi, sau này tôi sẽ thử cái này, đầu tiên là trong VM. Cảm ơn một lần nữa.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.