Cách sạch hơn để xóa các tệp trên Linux, bao gồm một dấu dữ liệu như là một phần của tên tệp


8

Tôi có một yêu cầu mới để lọc các tệp kết xuất MySQL cũ hơn 30 ngày. Các tệp sử dụng quy ước đặt tên của "all-mysql-YYYYMMDD-HHMM.dump". Các tệp được đặt trên hệ thống tệp được gắn SAN, vì vậy việc khôi phục không phải là vấn đề, nhưng không gian ổ đĩa bị hạn chế một cách đáng tiếc và lấp đầy nhanh chóng nên cần có sự can thiệp thường xuyên của con người.

Ví dụ về tên tệp

  • tất cả-mysql-20130324-2330.dump
  • tất cả-mysql-20130325-2330.dump
  • tất cả-mysql-20130326-2330.dump

Suy nghĩ đầu tiên của tôi là sử dụng "find" bên trong một tập lệnh bó với -mtime +30, tuy nhiên, thời gian sửa đổi không thể được đảm bảo và một số tài liệu lưu trữ cũ có thể trốn tránh ngày thanh trừng :)

Tôi đã tạo tập lệnh BASH sau đây, nhưng tôi hy vọng có một cách sạch hơn để thực hiện thao tác này.

#!/bin/bash

STARTING_DIR=$(pwd)

FILE_PREFIX=all-mysql-
BACKUP_DIR=/opt/backup/mysql/dumps
ARCHIVE_WINDOW_DAYS=30

cd $BACKUP_DIR

# Create YYYYMMDD datestamp for Today - $ARCHIVE_WINDOW_DAYS
ARCHIVE_WINDOW_IN_SECS=$(echo "$(date +%s) - (${ARCHIVE_WINDOW_DAYS} * 86400)" | bc)
PURGE_BEFORE_DATE=$(date -d @${ARCHIVE_WINDOW_IN_SECS} +%Y%m%d)

for backup_file in $FILE_PREFIX*
do
    # Trim prefix, time portion of date stamp, and file extension
    # from $backup_file to allow numeric comparison against YYYYMMDD
    backup_trim_tmp=${backup_file#${FILE_PREFIX}}
    backup_trimmed=${backup_trim_tmp%-****.dump}

    if [ ${PURGE_BEFORE_DATE} -gt ${backup_trimmed} ]
    then
        rm $backup_file
    fi
done

cd $STARTING_DIR

3
Có vẻ hoàn toàn phù hợp với tôi và tôi không thể thấy một cách đơn giản hơn để thực hiện chuyển đổi ngày so với cách bạn thực sự thực hiện. :)
tink

@tink - Cảm ơn bạn. Không thể giúp nghĩ rằng có một giải pháp lót cho việc này. Tôi quan tâm nhiều hơn đến những người bảo trì khác sống ở JavaLand nhiều hơn BASHland. Có lẽ mối quan tâm duy nhất là vấn đề "Năm 2038" rồi :)
TP

2
Không phải là logrotatemột giải pháp sạch hơn?
ott--

2
Đối với những thứ như thế này cũng cần có một biện pháp bảo vệ (không xóa các bản sao lưu cũ khi vì một lý do nào đó không có cái mới).
frostschutz

@ott - Đó có thể là một lựa chọn nếu nó hoạt động tốt trong vùng người dùng. Thật không may, chúng tôi (các kỹ sư ứng dụng) không được phép sử dụng bất kỳ quyền root hay su nào, vì vậy nếu có bất kỳ sự cố nào để syslog hoặc yêu cầu bất kỳ quyền riêng tư siêu người dùng nào khác, chúng tôi sẽ chìm trong bóng tối. Đó là một người lập dị nhưng đó là chính sách trị vì :(
TP

Câu trả lời:


3

Một cách khác để xóa tất cả ngoại trừ 30 tệp cuối cùng:

rm $(ls -r | tail -n +31)

Hoặc đây là phiên bản ngắn hơn của tập lệnh trong bài viết gốc:

cd /opt/backup/mysql/dumps
d=$(date -r $(($(date +%s)-30*86400)) +%Y%m%d)
for f in all-mysql-*; do
    [[ ${f#all-mysql-} < $d ]] && rm $f
done

Tùy chọn 1 sẽ không tính đến các bản sao lưu tạm thời có thể phát sinh hơn 30 tệp, nhưng tùy chọn 2 là điều tôi hy vọng đạt được (một kịch bản ngắn gọn hơn). Tuy nhiên, bộ tái cấu trúc tập lệnh đã đăng đã tạo ra lỗi, vì vậy tôi đã thay đổi dòng gán ngày thành d = $ (date -d @ $ (($ (ngày +% s) -30 * 86400)) +% Y% m% d ) và nó hoạt động giống hệt với kịch bản trong bài viết gốc.
TP

date -d không hoạt động trên OS X, nhưng -r dường như cũng có một ý nghĩa khác trong ngày gnu.
Lri

Vâng Một mã xác nhận GNU vs BSD :)
TP

1

Nếu bạn muốn xóa tất cả ngoại trừ 30 tệp cuối cùng:

rm `echo " " all-mysql-*.dump | sed -r -e 's/( [^ ]+){0,30}$//'`

Điều đó sẽ đáp ứng yêu cầu của bạn với điều kiện là có một bản sao lưu mỗi ngày và sơ đồ đặt tên vẫn giữ nguyên như vậy (nghĩa là thứ tự chữ cái = thứ tự thời gian, không có khoảng trắng trong tên tệp).

Bạn đặc biệt yêu cầu một lót trong một trong những ý kiến ​​của bạn. Cá nhân tôi thích viết nhiều thứ hơn. Lớp lót này là một chút về phía nguy hiểm (nếu sed thất bại, mọi thứ sẽ bị xóa).


Hiện tại, có thể có nhiều bản sao lưu (bãi) mỗi ngày để làm mới QA và môi trường cục bộ. Có lẽ đánh vần nó ra và chơi an toàn là cách tiếp cận tốt nhất.
TP

Sau đó, bạn có thể lên tới 40 hoặc 50 tệp (tuy nhiên nhiều bạn có thể đủ dung lượng lưu trữ). Nếu bạn có một hệ thống tập tin riêng cho các bản sao lưu đó, bạn thậm chí có thể chỉ ra dung lượng trống và chỉ rm bản sao lưu đầu tiên khi không đủ dung lượng.
frostschutz
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.