NTFS 파일 시스템을 사용하는 많은 컴퓨터의 백업이 포함 된 디렉토리가 있습니다.
/backup/REP1/database
/backup/REP2/database
이제 백업 파일 서버에서 데이터베이스 서버로 scp하고 싶습니다. 둘 다 Ubuntu 14를 실행 중입니다.
백업 디렉터리 안에는 대소 문자가 모두 같지는 않지만 이름이 같은 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
대체가 작동 할 것이라고 생각합니다. 구문을 잘 모르겠습니다.
내가 접근하는 방법은 다음과 같습니다.
요구 사항에 따라 파일 이름에 대한 glob을 생성하는 함수를 만듭니다 (모든 문자가 대문자 또는 소문자로 표시 될 수 있음).
scp
glob을 원격 파일 이름으로 사용하고 이미 소문자로 된 파일 이름을 로컬 파일 이름으로 사용 하도록 루프를 수정합니다 .
이것은 당신이 현재하는 것과 같이 파일 당, 컴퓨터 당 동일한 하나의 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을 지정합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다