NTFSファイルシステムを使用する複数のコンピュータのバックアップを含むディレクトリがあります。
/backup/REP1/database
/backup/REP2/database
これで、Ubuntu 14を実行しているバックアップファイルサーバーからデータベースサーバーにscpを実行したいと思います。
バックアップディレクトリには大文字と小文字は同じではありませんが、名前には同じVisual FoxProファイルが含まれています。バックアップディレクトリにscpを望まない他のファイルがあります。
/backup/REP1/database/usersupport.DBF
/backup/REP1/database/System.dbf
/backup/REP2/database/UserSupport.dbf
/backup/REP2/database/system.dbf
私のBashスクリプトでは、2つのループを使用してリモートパスとファイル名を作成します。
computer_list=(REP1 REP2 REP3 REP4 REP5 REP6 REP7 REP8 REP9 REP10 REP11 REP12 REP13 REP14 REP15 REP16)
file_list=(usersupport.cdx usersupport.dbf usersupport.fpt system.dbf)
for computer_name in ${computer_list[@]}; do
## delete working dir
delete_working_dir
for file_name in ${file_list[@]}; do
remote_file=${remote_path}${computer_name}/${dow}/CustomerData/system/${file_name}
local_file=${working_directory}${file_name}
#echo $remote_file
echo $local_file
# scp -i $ID $USER@$HOST:$remote_file $local_file > /dev/null 2>&1
scp -i $ID $USER@$HOST:$remote_file $local_file
# change databse file permissions
chmod 0777 ${local_file}
done
# process mysql
process_mysql
## delete working dir
delete_working_dir
done
大文字と小文字が異なる場合、scpコマンドはソースファイルをコピーしません。
大文字と小文字に関係なくソースファイルを取得する正確なまたは簡単な方法は何ですか?
頑張ったけどshopt -s nocasematch
行かなかった
リモートファイル名に置き換えを使用できますか?
[:lower]
これユーザーこれを使用すると、代替が
scp -B -p ${Auser}@${aSrcHOST}:${aSrcDIR}/*.[Oo][Kk] $aTgtDIR
効果があると信じています。構文がわからない。
ベストアンサー1
私が処理する方法は次のとおりです。
要件に応じて、ファイル名のグローバル変数を生成する関数を作成します(すべての文字は大文字または小文字で表示できます)。
scp
globをリモートファイル名として使用し、すでに小文字のファイル名をローカルファイル名として使用するようにループを変更します。
これにより、現在のようにファイルごと、コンピュータごとに1つのscp接続が作成されますが、globbingは「大文字と小文字を区別する」方法に関係なくリモートファイルを選択します。
(bash関連)機能は次のとおりです。
function ul {
# for each character in $1, convert it to upper and lower case, then
# enclose it in [ ]
out=
for (( i=0; i< ${#1}; i++ ))
do
c=${1:$i:1}
if [[ "$c" =~ ^[[:alpha:]]$ ]]
then
uc=${c^}
lc=${c,}
out="${out}[${uc}${lc}]"
else
out="${out}${c}"
fi
done
printf "%s" "$out"
}
したがって、同じスクリプトに配置することも、ソースを取得できるパブリック領域に配置することもできます。
使い方を示しています。
$ g=$(ul system.dbf)
$ echo "$g"
[Ss][Yy][Ss][Tt][Ee][Mm].[Dd][Bb][Ff]
ステップ2では、次のように修正します。内部にリング:
for file_name in ${file_list[@]}; do
g=$(ul "$file_name")
remote_file=${remote_path}${computer_name}/${dow}/CustomerData/system/${g}
local_file=${working_directory}${file_name}
echo $local_file
scp -i $ID $USER@$HOST:$remote_file $local_file
chmod 0777 ${local_file}
done
私はそのg=
割り当てをremote_file割り当てと一緒に追加しました(行末)。