![如何通过 bash 脚本使用 scp 复制大小写未知的文件](https://linux22.com/image/94449/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20bash%20%E8%84%9A%E6%9C%AC%E4%BD%BF%E7%94%A8%20scp%20%E5%A4%8D%E5%88%B6%E5%A4%A7%E5%B0%8F%E5%86%99%E6%9C%AA%E7%9F%A5%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有一个目录,其中包含许多使用 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
所以我相信替代可能有效。我不确定语法。
答案1
我的处理方法如下:
创建一个函数,根据要求生成文件名的全局变量(任何字符都可以显示为大写或小写)。
修改循环以
scp
使用 glob 作为远程文件名,并将已经小写的文件名作为本地文件名。
这将为每个文件、每台计算机创建与当前相同的一个 scp 连接,但通配将拾取远程文件,无论它是如何“大小写”的。
这是(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 分配(在该行的末尾)。