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을 원격 파일 이름으로 사용하고 이미 소문자인 파일 이름을 로컬 파일 이름으로 사용하도록 루프를 수정합니다 .

이렇게 하면 현재와 같이 파일당, 컴퓨터당 하나의 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 할당과 함께 추가했습니다(줄 끝에).

관련 정보