Bash สคริปต์ลบอัตโนมัติ


2

ฉันกำลังมองหาสคริปต์ทุบตีที่จะลบโฟลเดอร์ที่เก่าที่สุดโดยอัตโนมัติ (สมมติว่า 3 รายการสุดท้าย) ในไดเรกทอรีเมื่อพื้นที่ว่างลดลงต่ำกว่า X gigs

ฉันอ่านโพสต์ที่เกี่ยวข้อง แต่เนื่องจากฉันไม่รู้อะไรเลยฉันไม่ทราบวิธีแก้ไขสคริปต์อย่างปลอดภัยด้วยตนเอง


รวมลิงค์ไปยังโพสต์ที่เกี่ยวข้อง ฉันจะพยายามแก้ไขให้คุณ เพียงเจาะจงเกี่ยวกับไดเรกทอรีที่คุณต้องการทำงาน

เพียงแค่ต้องการทราบว่าการค้นหา "โฟลเดอร์ที่เก่าที่สุด" อาจเป็นเรื่องยุ่งยาก หากคุณสร้าง /foo/bar/baz.txt เวลาการแก้ไขของบาร์จะได้รับการอัปเดต แต่ foo จะไม่อัพเดท เช่นเดียวกันถ้าคุณ แก้ไข /foo/bar/baz.txt ยังทำงานอยู่แม้จะไม่มีการอัปเดตเวลาของแถบเพราะไม่มีการเปลี่ยนรายการไดเรกทอรี หากจำเป็นต้องนำมาพิจารณาโปรดแจ้งให้เราทราบ
Jander

คำตอบ:


2

คุณต้องปรับแต่ง PARTITION DIR_TO_CHECK จำกัด และ NUM_DIRS_TO_DELETE บล็อก BLOCKSIZE และ NUM_DIRS_TO_DELETE

LIMIT เป็นจำนวนกิกะไบต์ที่ใช้ได้

ระวังด้วยสิ่งนี้เมื่อคุณไม่คอมเม้นท์คำสั่ง rm ไดเร็กทอรีที่ลบไปจะหายไป!

#!/bin/bash
IFS=$'\n'

PARTITION="/dev/sdb1"
DIR_TO_CHECK="/home/bryan/temp/*/"
BLOCKSIZE=1000000000 
LIMIT=12
NUM_DIRS_TO_DELETE=4


if [ $(df  -B $BLOCKSIZE  $PARTITION | tail -1 |  awk  '{ print $4}') -gt $LIMIT ]; then
  echo "plenty of space"
else 
   for i in $(ls -d $DIR_TO_CHECK --group-directories-first  -tr | head -$NUM_DIRS_TO_DELETE)
   do

      du -h $i
      # When you are happy that the script does what you want, 
      # delete the above line and remove the # character from the below
      # rm -r $i 
   done
fi

1
มีสองวิธีที่สคริปต์นี้จะล้มเหลว ที่ใหญ่ที่สุดคือคุณไม่สามารถพึ่งพา -f18 เป็นหมายเลขฟิลด์ที่ถูกต้องเพราะจำนวนช่องว่างจะแตกต่างกันไปขึ้นอยู่กับความยาวของสตริงตัวเลข จะเป็นการดีกว่าถ้าใช้ AWK เพื่อเลือกฟิลด์ นอกจากนี้หากมีช่องว่างในชื่อไฟล์หรือชื่อไดเรกทอรี for ลูปจะล้มเหลว ls -d /foo/*/ จะแสดงรายการไดเรกทอรีเนื่องจากเครื่องหมายทับสุดท้าย df -k แสดงขนาดตามบล็อก 1K แต่ก็ไม่ชัดเจนว่าเป็นของคุณหรือไม่ LIMIT ตัวแปรมีหน่วยเป็นไบต์หรือ K-bytes คุณควรใช้ $() สำหรับการทดแทนคำสั่งแทน backticks
Dennis Williamson

ขอบคุณสำหรับคำแนะนำได้ทำการเปลี่ยนแปลง โปรดลองดูอีกครั้งและแจ้งให้เราทราบว่าคุณคิดอย่างไร
bryan

คำถามงี่เง่า: สคริปต์จะตรวจสอบอย่างสม่ำเสมอสำหรับเงื่อนไข if หรือเฉพาะในการดำเนินการหรือไม่ และถ้าเฉพาะในการดำเนินการวิธีการทำให้มันดำเนินการในบางช่วงเวลาหรือในการสร้างโฟลเดอร์ใหม่ได้อย่างไร
Halik

มันจะดำเนินการเมื่อมีการเรียก หากคุณต้องการให้มันใช้ช่วงเวลาปกติใช้ cron clickmojo.com/code/cron-tutorial.html .
bryan

ฉันทดสอบสคริปต์และใช้งานได้ดียกเว้นสิ่งหนึ่ง - ตรวจสอบพื้นที่ว่างบนไดรฟ์ (sda3 ในกรณีของฉัน) แต่ฉันต้องการให้มันตรวจสอบพื้นที่ว่างที่มีอยู่ในบ้าน มีพื้นที่ว่างประมาณ 150 กิ๊กบนไดรฟ์ที่ / home ติดตั้งอยู่ แต่มีเพียง 60 กิ๊กเท่านั้นที่ได้รับมอบหมายให้ฉัน และขอโทษที่จู้จี้จุกจิกมาก: & gt;
Halik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.