Score:2

สคริปต์ทุบตี: ลบไฟล์เก่าแบบมีเงื่อนไขในขณะที่เก็บสำเนาล่าสุดไว้

ธง kp

หมายเหตุ: แม้ว่าจะมีคำตอบจากเจฟฟ์-ชอลเลอร์ แต่ก็ขึ้นอยู่กับ zsh; เลยอยากได้คำตอบตาม ทุบตี.

ฉันต้องการสร้างสคริปต์ Bash เพื่อลบไฟล์เก่าอย่างมีเงื่อนไขจากไดเร็กทอรีสำรอง

มี 2 ​​เงื่อนไขสำหรับการสำรองไฟล์ที่แตกต่างกัน 2 ไฟล์:

1 เก็บสำเนาล่าสุดของ Edge_Profile_*.tgzและลบส่วนที่เหลือของ Edge_Profile_*.tgz เฉพาะในกรณีที่มีอายุมากกว่า 5 วัน.

2 เก็บสำเนาล่าสุดของ Firefox_Profile_*.tgzและลบส่วนที่เหลือของ Firefox_Profile_*.tgz, ไม่สำคัญว่าพวกเขาจะอายุเท่าไหร่.

นี่คือวิธีที่ฉันได้แก้ไขคำตอบ AskUbuntu นี้: https://askubuntu.com/a/933098/928088

สคริปต์:

#!/bin/bash

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

mv $LOG_FILE $TEMP_LOG

{

cd /home/admn/ดาวน์โหลด/ทดสอบ;

echo "บันทึกการล้างข้อมูล:" `วันที่`

ค้นหา /home/admn/ดาวน์โหลด/ทดสอบ/Edge_Profile_*.tgz -type f \( -mtime +5 -printf 'Y\t' -o -printf 'N\t' \) -printf '%A@\t% p\0' |
    จัดเรียง -zk2,2 | หัว -zn -1 | ขณะอ่าน -r -d '' flag _ file; ทำ \
        กรณี "$flag" ใน 
            'Y') echo rm "$ไฟล์" 
               ;; 
            *) echo "ข้าม $file (ใหม่เกินไป)"
               ;; 
        เอสแซค;
เสร็จแล้ว

เสียงสะท้อน

ค้นหา /home/admn/ดาวน์โหลด/ทดสอบ/Firefox_Profile_*.tgz -type f \( -printf 'Y\t' -o -printf 'N\t' \) -printf '%A@\t%p\0' |
    จัดเรียง -zk2,2 | หัว -zn -1 | ขณะอ่าน -r -d '' flag _ file; ทำ \
        กรณี "$flag" ใน 
            'Y') echo rm "$ไฟล์" 
               ;; 
            *) echo "ข้าม $file (ใหม่เกินไป)"
               ;; 
        เอสแซค        
เสร็จแล้ว

} &>> $LOG_FILE

แมว $TEMP_LOG >>$LOG_FILE

ทางออก;

เอาต์พุตในล็อกไฟล์ด้วย เสียงสะท้อน:

/usr/local/scripts/cleanup.sh

rm /home/admn/ดาวน์โหลด/ทดสอบ/Edge_Profile_Jul_06_2021_00-35.tgz
rm /home/admn/ดาวน์โหลด/ทดสอบ/Edge_Profile_Jul_07_2021_00-35.tgz
....
ข้าม /home/admn/Downloads/Test/Edge_Profile_Jul_12_2021_00-35.tgz (ใหม่เกินไป)
ข้าม /home/admn/Downloads/Test/Edge_Profile_Jul_13_2021_00-35.tgz (ใหม่เกินไป)
....

rm /home/admn/ดาวน์โหลด/ทดสอบ/Firefox_Profile_Jul_01_2021_00-35.tgz
rm /home/admn/ดาวน์โหลด/ทดสอบ/Firefox_Profile_Jul_02_2021_00-35.tgz
....

เอาต์พุตในล็อกไฟล์ขณะรันสคริปต์จริง โดยไม่มี เสียงสะท้อน:

/home/admn/Downloads/cleanup.sh: บรรทัดที่ 24: ข้าม /home/admn/Downloads/Test/Edge_Profile_Jul_12_2021_00-35.tgz (ใหม่เกินไป): ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
/home/admn/Downloads/cleanup.sh: บรรทัดที่ 24: ข้าม /home/admn/Downloads/Test/Edge_Profile_Jul_13_2021_00-35.tgz (ใหม่เกินไป): ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
....

ไฟล์ทั้งหมดในไดเรกทอรี: 20 ไฟล์

1, Edge_Profile_*.tgz: ตั้งแต่วันที่ 6 กรกฎาคม ถึง 17 กรกฎาคม: 12 ไฟล์

2, Firefox_Profile_*.tgz: ตั้งแต่วันที่ 1 กรกฎาคม ถึง 08 กรกฎาคม: 8 ไฟล์

ประเด็น:

(1) ฉัน คิด สคริปต์ใช้งานได้ แต่ฉันไม่แน่ใจเพราะฉันได้แก้ไขส่วนใหญ่โดยไม่รู้ว่าเกิดอะไรขึ้น

(2) เอาต์พุตไปยังล็อกไฟล์:

ฉันต้องการผลลัพธ์ที่เหมือนกันทุกประการในล็อกไฟล์ที่ฉันได้รับ เสียงสะท้อนยกเว้นเพียงชื่อไฟล์ (ไม่ใช่พาธแบบเต็ม) เช่น:

rm Edge_Profile_Jul_11_2021_00-35.tgz

ข้าม Edge_Profile_Jul_12_2021_00-35.tgz (ใหม่เกินไป)

ระบบปฏิบัติการ: Ubuntu MATE 21.04

ขอบคุณมาก.

Score:1
ธง ru

การจัดการไฟล์ตามเวลาแก้ไขนั้นง่ายกว่ามากในเชลล์ที่ให้คุณเข้าถึงไฟล์ได้โดยตรง zsh เป็นหนึ่งในเชลล์ดังกล่าว อย่างง่าย sudo apt ติดตั้ง zsh เพื่อติดตั้ง เนื่องจากไฟล์ของคุณดูเหมือนจะอยู่ในไดเร็กทอรีเดียว คำตอบนี้จึงไม่เรียกซ้ำ สาธิตกรณีที่ง่ายกว่าก่อน:

  • หากต้องการเก็บสำเนาล่าสุดของ Firefox_Profile_*.tgz ไว้และลบส่วนที่เหลือออกไม่ว่าจะมีอายุเท่าใด:

    เสียงสะท้อนจะ rm -v -- Firefox_Profile_*.tgz(.om[2,-1])
    

    ลบ เสียงสะท้อนจะ ส่วนถ้าเห็นว่าถูกต้อง สิ่งนี้ใช้ glob (ตัวแทน) รอบคัดเลือก ภายในวงเล็บให้ทำสามสิ่ง:

    • เลือกเฉพาะไฟล์ธรรมดา (ไม่ใช่ไดเร็กทอรีหรือซ็อกเก็ตหรืออื่นๆ) ด้วย .
    • เรียงลำดับ (จัดเรียง) ไฟล์ตามเวลาที่แก้ไข จากใหม่สุดไปเก่าสุด ด้วย โอม
    • เลือกส่วนของรายการผลลัพธ์ที่เริ่มต้นจากองค์ประกอบที่สองไปยังจุดสิ้นสุด - ข้ามไฟล์แรก (ใหม่ล่าสุด) ด้วย [2,-1]

    หากไม่มีไฟล์ที่ตรงกัน zsh จะหยุดและบ่นว่า "zsh: ไม่พบข้อมูลที่ตรงกัน" และจะไม่ดำเนินการ rm.

  • หากต้องการเก็บสำเนาล่าสุดของ Edge_Profile_*.tgz และลบส่วนที่เหลือเฉพาะในกรณีที่มีอายุมากกว่า 5 วัน ก่อนอื่นเราจะคว้าสำเนาล่าสุด:

    ใหม่ล่าสุด=(Edge_Profile_*.tgz(.om[1]))
    

    ... แล้วเราจะได้อันที่เก่ากว่าห้าวัน:

    เก่ากว่า=(Edge_Profile_*.tgz(.m+5))
    

    ส่วนใหม่ที่นี่คือ +5 บน ตัวดัดแปลง ที่เลือกไฟล์ที่มีอายุมากกว่า 5 วัน หลังจากนั้น เราตรวจสอบให้แน่ใจว่ารายการใหม่ล่าสุดไม่ได้อยู่ในรายการที่จะลบ:

    remove=("${(@)เก่ากว่า:|ใหม่ล่าสุด}")
    

    ส่วนใหม่ที่นี่คือสัญลักษณ์การลบอาร์เรย์ :|; มันถูกบันทึกไว้ใน ส่วนการขยายพารามิเตอร์ของคู่มือ zsh. เลือกองค์ประกอบของ "เก่ากว่า" ที่ไม่ได้อยู่ใน "ใหม่ล่าสุด" สุดท้าย เราลบรายการไฟล์นั้น:

    เสียงสะท้อนจะ rm -v -- "${remove[@]}"
    
Jags avatar
kp flag
ขอบคุณสำหรับคำตอบ แต่ฉันชอบใช้ `Bash` 'เพราะครั้งสุดท้ายที่ฉันติดตั้ง `zsh` ฉันลงเอยด้วยการฟอร์แมตและการติดตั้งใหม่ทั้งหมด
Jeff Schaller avatar
ru flag
คุณไม่จำเป็นต้องใช้มันเป็นเปลือกประจำวันของคุณ เพียงติดตั้งและใช้สำหรับสคริปต์นี้
Jags avatar
kp flag
โอเค ทีหลังฉันจะลองทำสิ่งนี้ ครั้งแรกใน VM ขอบคุณอีกครั้ง.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา