Dividir cadeia de nomes de arquivos em uma matriz

1

Estou tentando obter uma listagem de todos os arquivos em um diretório específico (/ myfiles) e, em seguida, enviá-los para outro servidor. O número de arquivos irá variar e seus nomes serão assim - eles serão assim: Tipo de relação Table_c_Primary de tradução de código Tradução de código Table_e_Transaction Type

Eu estava tentando colocar todos eles em uma matriz e fazer um loop while (baseado em count) com um comando sftp put. No entanto, parece que não consigo colocar essa string em um array.

Aqui está o que eu tenho:

export directory='find -name *Table_\*'
IFS="./"
read -a filearry <<< "${directory}"

Durante o teste, apenas $ {filearry [0]} é preenchido. A saída do echo $ {filearry [0]} é:

Code Translation Table_c_Primary Relationship Type
Code Translation Table_e_Transaction Type
Code Translation Table_f_Appeal Code
Code Translation Table_g_Campaign Codes
Code Translation Table_h_Designation Code
Code Translation Table_i_Designation Purpose
Code Translation Table_j_Address Types
Code Translation Table_k_Degree of Graduation
Code Translation Table_l_Relationship Type
Code Translation Table_m_Activity Role
Code Translation Table_n_Activity Status Club
Code Translation Table_o_Participation Category
Code Translation Table_p_Activity Status Organization
Code Translation Table_q_Restriciton Code
Code Translation Table_c_Primary Relationship Type

Edit: Isso precisa ser um script automatizado iniciado pelo cron. Eu não sou forçado a usar o sftp, mas qualquer que seja a maneira que eu use, é seguro.

Acabei simplificando o script para fazer o upload de todos os arquivos no diretório, não importa qual seja o nome. Eu tenho a saída indo para um arquivo de log que é enviado como um email de texto para algumas pessoas no meu escritório. O formato deste e-mail não é ótimo. Todos os arquivos estão listados na mesma linha, dificultando a leitura - isso é solucionável?

if [ "$(ls -A $DIR)" ]; 
then 
    printf "=====================================================\n"
    printf " $DIR contains files.\n"
    printf "=====================================================\n"
    sftp [email protected]:/upload <<EOF
    put -r /myfolder/*
    quit
EOF
    printf "=====================================================\n"
    printf "Done transfering files.\n"
    printf "=====================================================\n"
else 
    printf "No files to upload in $DIR"
fi

mailx -s 'Document Feed' [email protected] < /var/log/docfeed.log
    
por Robert 10.10.2017 / 22:19

2 respostas

2

Você obtém uma matriz de nomes de arquivos assim:

filenames=( *Table_* )

Supondo que você não pode simplesmente usar scp para copiar todos os arquivos com

scp *Table_* user@host:dir/

você pode criar um script em lote para sftp :

printf 'put "%s"\n' *Table_* | sftp user@host:/dir

Se você quiser renomeá-los no destino, por exemplo, substitua todos os espaços por sublinhados (usando a substituição de padrão ${parameter//pattern/string} ):

for name in *Table_*; do
    printf 'put "%s" "%s"\n' "$name" "${name// /_}"
done | sftp user@host:/dir

Outra solução óbvia é criar um arquivo do arquivo relevante e transferir este arquivo para o outro host:

tar -cf archive.tar *Table_*

echo 'put archive.tar' | sftp user@host:/dir
    
por 10.10.2017 / 22:37
0

Acho que estou dividindo o cabelo aqui, mas fwiw, para realizar o que eu queria fazer originalmente, posso usar:

 shopt -s nullglob
 documentarray=(*Translation*)
 for i in "${documentarray[@]}"
 do
 #sftp stuff here

 done
    
por 13.10.2017 / 18:33

Tags