bashスクリプトを介してscpを使用して大文字と小文字が不明なファイルをコピーする方法

bashスクリプトを介してscpを使用して大文字と小文字が不明なファイルをコピーする方法

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

私が処理する方法は次のとおりです。

  1. 要件に応じて、ファイル名のグローバル変数を生成する関数を作成します(すべての文字は大文字または小文字で表示できます)。

  2. scpglobをリモートファイル名として使用し、すでに小文字のファイル名をローカルファイル名として使用するようにループを変更します。

これにより、現在のようにファイルごと、コンピュータごとに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割り当てと一緒に追加しました(行末)。

おすすめ記事