Como copiar com scp um arquivo que o caso é desconhecido via script bash

3

Eu tenho um diretório que contém o backup de muitos computadores usando o sistema de arquivos NTFS.

/backup/REP1/database
/backup/REP2/database

Agora eu quero scp do servidor de arquivos de backup para o servidor de banco de dados, ambos estão executando o Ubuntu 14.

Dentro dos diretórios de backup estão os arquivos do Visual FoxPro que não são todos iguais, mas são do mesmo nome. Existem outros arquivos no diretório de backup que eu não quero scp.

/backup/REP1/database/usersupport.DBF
/backup/REP1/database/System.dbf

/backup/REP2/database/UserSupport.dbf
/backup/REP2/database/system.dbf

No meu script bash eu estou usando 2 loops para criar o caminho remoto e nomes de arquivos.

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

O comando scp não copiará o arquivo de origem se o caso não for o mesmo.

Qual seria a maneira correta ou mais fácil de obter o arquivo de origem, independentemente do caso.

Eu tentei shopt -s nocasematch , mas não vou.

Posso usar substituição no nome do arquivo remoto? [:lower]

Este usuário usa isto %código% Então eu acredito que a substituição pode funcionar. Não tenho certeza da sintaxe.

    
por jc__ 14.09.2016 / 19:34

1 resposta

2

Veja como eu abordaria isso:

  1. Crie uma função que gere globs para nomes de arquivos com base no requisito (qualquer caractere pode aparecer como maiúscula ou minúscula).

  2. Modifique o loop para que o scp use o glob como o nome do arquivo remoto e o nome do arquivo já com o nome do arquivo local.

Isso criará a mesma conexão scp por arquivo, por computador, como você faz atualmente, mas a globbing vai pegar o arquivo remoto, não importa como ele seja "encaixado".

Aqui está a função (bash-specific):

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"
}

Então, você coloca isso no mesmo script ou em alguma área comum que é originada.

Para demonstrar seu uso:

$ g=$(ul system.dbf)
$ echo "$g"
[Ss][Yy][Ss][Tt][Ee][Mm].[Dd][Bb][Ff]

Para o passo 2, foi assim que modifiquei o seu loop inner :

    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

Adicionei a designação g= e a designação remote_file (no final da linha).

    
por 14.09.2016 / 22:24