#!/bin/bash switch=0 #スイッチ 0…サーバー内で複写 1…サーバー外から転送 server=genius@itpass.scitec.kobe-u.ac.jp #ログインするユーザー名@サーバー名(上のスイッチが1のときに必要) if [ $# -lt 2 ] #転送元、転送先が指定されていない場合 then echo "usage: $0 source_directory target_directory" #文句を言って exit #終了 fi from=$1 #転送元ディレクトリ to=$2 #転送先ディレクトリ home=`pwd` #スクリプトのあるディレクトリ名を取得 cd $from #転送元のディレクトリに移動 moto=`pwd` #転送元の初めのディレクトリ名を取得 #ls -lR #試運転用 list=(`ls -R`) #ディレクトリ内の全てのディレクトリとファイルの名前を読み込む fn=${#list[@]} #ディレクトリとファイルの個数 echo "saving and changing permission..." #パーミッション保存&変更中メッセージを表示 mlist="" #元パーミッション記録用配列 nn=0 while : #↓ここからパーミッションを適切に変更 do filenm=`echo "${list[$nn]}" | sed 's/\:$/\//'` #ファイル名を取り出す nmhead=`echo $filenm | cut -c1-2` #ファイル名の先頭2つの文字を取り出す if [ $nmhead = "./" ] #それがもし"./"(ディレクトリ)なら then mlist=("${mlist[@]}" "$filenm") #ディレクトリ名を元パーミッション記録用配列に追加 folnm=`echo $filenm | cut -c2-` #ディレクトリ名を取り出す else cd $moto$folnm #ファイルのあるディレクトリに移動 prm=`ls -dl $filenm | cut -f1 -d" " | sed 's/(.*?)\s//' | cut -c2-10` #元のパーミッションを取り出す cd $moto #一番上のディレクトリに戻って mlist=("${mlist[@]}" "$prm$filenm") #元のパーミッションとファイル名を元パーミッション記録用配列に追加 cd $moto$folnm #再びファイルのあるディレクトリに移動 type=`file $filenm | sed "s/${filenm}\: //"` #ファイルタイプを調べて取り出す pf="664" #普通のファイルのパーミッション tlist=("directory" "Bourne-Again shell script text executable") #パーミッションを775にするファイルタイプ一覧 for i in `seq 1 ${#tlist[@]}` #上の一覧を一つずつ調べる do if [ "$type" = "${tlist[`expr $i - 1`]}" ] #上の一覧にあるファイルタイプなら then pf="775" #775に設定 fi done chmod $pf $filenm #パーミッションの変更を実行 fi nn=`expr $nn + 1` #ループのカウンターを1増やす if [ $nn -eq $fn -o $nn -gt $fn ] #ループのカウンターがファイルの個数以上になったら then break #ループ終了 fi done #↑パーミッションを適切に変更ここまで cd $home #ディレクトリを初めに戻す echo "sending files..." #転送中メッセージを表示 case $switch in #スイッチが 0) #0のとき cp -afru $from $to #cpで転送を実行 ;; 1) #1のとき scp -r $from $server:$to #scpで転送を実行 ;; esac cd $moto #転送元のディレクトリに移動 #ls -lR #試運転用 echo "restoring permission..." #パーミッション復元中メッセージを表示 fn=${#mlist[@]} #ディレクトリとファイルの個数 nn=1 #ループのカウンター while : #↓ここからパーミッションを元に戻す do filenm=`echo "${mlist[$nn]}"` #元のパーミッションとファイル名を取り出す nmhead=`echo $filenm | cut -c1-2` #先頭2つの文字を取り出す if [ "$nmhead" = "./" ] #それがもし"./"(ディレクトリ)なら then folnm=`echo $filenm | cut -c2-` #ディレクトリ名を取り出す else cd $moto$folnm #ファイルのあるディレクトリに移動 prmu=`echo $filenm | cut -c1-3 | sed "s/\-//g"` #元のパーミッションを取り出す prmg=`echo $filenm | cut -c4-6 | sed "s/\-//g"` #元のパーミッションを取り出す prmo=`echo $filenm | cut -c7-9 | sed "s/\-//g"` #元のパーミッションを取り出す filenm=`echo $filenm | cut -c10-` #ファイル名を取り出す chmod u=$prmu,g=$prmg,o=$prmo "$filenm" #パーミッションを元に戻す fi nn=`expr $nn + 1` #ループのカウンターを1増やす if [ $nn -eq $fn -o $nn -gt $fn ] #ループのカウンターがファイルの個数以上になったら then break #ループ終了 fi done #↑パーミッションを元に戻すここまで echo "finished." #終了メッセージを表示 cd $moto #転送元のディレクトリに移動 #ls -lR #試運転用 exit #おしまい