とあるディレクトリのバックアップとりたいなー、でもディレクトリは上書きにしたいなーとか、そんなことを考えてたときに調べたことです。
ディレクトリごとコピーする
ディレクトリをコピーしたいときは 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`