如何通过 bash 脚本使用 scp 复制大小写未知的文件

如何通过 bash 脚本使用 scp 复制大小写未知的文件

我有一个目录,其中包含许多使用 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

我的处理方法如下:

  1. 创建一个函数,根据要求生成文件名的全局变量(任何字符都可以显示为大写或小写)。

  2. 修改循环以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 分配(在该行的末尾)。

相关内容