2017-02-23 12 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は最新のバックアップファイルです。 過去10日でファイルが削除されます。 他のサーバーからの着信ファイルは、次のように単純に名前が付けられます。シェルバックアップスクリプトの名前を変更

どうすればいいですか? 私が試した:

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

関連する問題