2017-02-23 71 views
0

我能夠腳本備份過程,但我想爲存儲服務器創建另一個腳本以進行基本文件輪換。 我想做什麼: 我想將我的文件存儲在我的/ home/user/backup文件夾中。只想存儲10個最新的備份文件,並將它們命名爲: site_foo_date_1.tar site_foo_date_2.tar ... site_foo_date_10.tar site_foo_date_1.tar是最新的備份文件。 過去的num10文件將被刪除。 我從其他服務器傳入的文件只是這樣命名的:site_foo_date.tarshell備份腳本重命名

我該怎麼做? 我想:

DATE=`date "+%Y%m%d"` 


cd /home/user/backup/com 
if [ -f site_com_*_10.tar ] 
then 
rm site_com_*_10.tar 
fi 

FILES=$(ls) 

for file in $FILES 
do 
echo "$file" 
if [ "$file" != "site_com_${DATE}.tar" ] 
then 
str_new=${file:18:1} 
new_str=$((str_new + 1)) 
to_rename=${file::18} 
mv "${file}" "$to_rename$new_str.tar" 
fi 
done 

file=$(ls | grep site_com_${DATE}.tar) 
filename=`echo "$file" | cut -d'.' -f1` 
mv "${file}" "${filename}_1.tar" 
+0

您遇到的確切問題是什麼? – CJxD

+0

由於某種原因,它重命名的文件是這樣的: site_foo_date_2.tar site_foo_date_4.tar site_foo_date_6.tar ... 在下一個週期: site_foo_date_3.tar site_foo_date_5.tar site_foo_date_7.tar 所以每第二個數字是失蹤,我不不知道爲什麼。 – kesien

+0

對我來說工作得很好 - 我要做的只是通過解釋來製作一個更具韌性的代碼版本 – CJxD

回答

0

與您的代碼的主要問題是,通過與ls *目錄中的所有文件循環沒有某種形式的過濾器是做一件危險的事情。

取而代之,我使用for i in $(seq 9 -1 1)來循環從* _9到* _1的文件來移動它們。這確保我們只移動備份文件,而不會意外地進入備份目錄。

此外,依靠序號是文件名中的第18個字符也註定要中斷。如果將來需要10個以上的備份會發生什麼?通過這種設計,您可以將9更改爲您喜歡的任何數字,即使它超過2位數字。

最後,我在移動site_com_${DATE}.tar之前添加了一個支票,以防萬一它不存在。

#!/bin/bash 

DATE=`date "+%Y%m%d"` 

cd "/home/user/backup/com" 
if [ -f "site_com_*_10.tar" ] 
then 
rm "site_com_*_10.tar" 
fi 

# Instead of wildcarding all files in the directory 
# this method picks out only the expected files so non-backup 
# files are not changed. The renumbering is also made easier 
# this way. 
# Loop through from 9 to 1 in descending order otherwise 
# the same file will be moved on each iteration 
for i in $(seq 9 -1 1) 
do 
# Find and expand the requested file 
file=$(find . -maxdepth 1 -name "site_com_*_${i}.tar") 
if [ -f "$file" ] 
then 
echo "$file" 
# Create new file name 
new_str=$((i + 1)) 
to_rename=${file%_${i}.tar} 
mv "${file}" "${to_rename}_${new_str}.tar" 
fi 
done 

# Check for latest backup file 
# and only move it if it exists. 
file=site_com_${DATE}.tar 
if [ -f $file ] 
then 
filename=${file%.tar} 
mv "${file}" "${filename}_1.tar" 
fi 
+0

謝謝!有用 ! :) – kesien