バックアップを取りたいときにディレクトリやファイルをコピーする小技集

とあるディレクトリのバックアップとりたいなー、でもディレクトリは上書きにしたいなーとか、そんなことを考えてたときに調べたことです。

ディレクトリごとコピーする

ディレクトリをコピーしたいときは r オプションをつけて再帰的にコピーします。

cp -r src_dir backup_dir

ディレクトリ以外だけコピーする

ディレクトリ以外、つまりファイルのみコピーする方法です。

ls コマンドの -F オプションを使うとディレクトリ名の後に / をつけて表示します。これを利用して、grep コマンドで / を含まないものだけを取得するようにしてリストを作成しています。

あとは for 文でリストの要素をコピーしています。

srcdir=/path/to/srcdir
backupdir=/path/to/backupdir
target_file_list=(`ls -F $dirname | grep -v /`)
for fname in "${target_file_list[@]}"
do
  cp $dirname$fname $backupdir
done

ディレクトリだけコピーする

逆にディレクトリだけをコピーする場合は、grep の -v オプションを使わないようにすれば良いわけです。つまり、次のようになります。

srcdir=/path/to/srcdir
backupdir=/path/to/backupdir
target_file_list=(`ls -F $dirname | grep /`)
for fname in "${target_file_list[@]}"
do
  cp -r $dirname$fname $backupdir
done

ディレクトリの存在をチェックして、なければ新規作成する

コピー先にディレクトリがないとエラーになってしまいます。これを回避するために、ディレクトリの存在チェックを行い、存在しない場合はディレクトリを作成してから次の処理に写るようにします。次のようなシェルで実現できます。

TARGET_DIR=/path/to/dir

if [ ! -d $TARGET_DIR ]; then 
  #ディレクトリが存在しない場合は作成
  mkdir $TARGET_DIR
else 
  #ディレクトリが存在し、空でない場合は警告を出して終了
  if [ -n "$(ls -A $TARGET_DIR)" ]; then
    echo "出力先にファイルが存在します: $TARGET_DIR"
    exit 1
  fi
fi

配列を作る

特定のディレクトリやファイルにだけ処理を行いたい場合、配列に格納しておいて別の処理をさせる例です(ハードコーディングになってしまってイマイチですが。。。)

declare -a array=("a" "b" "c")

for e in ${array[@]};
do
  echo ${e}
done

現在時刻を取得する

バックアップファイルに日付情報をつけたい時は次のように date コマンドを使います。

echo filename.`date +%Y%m%d%H%M%S`

参考文献

タイトルとURLをコピーしました