Shell Script for copying renamed file structure to target

Asked

Viewed 443 times

1

I would like to copy a folder structure already renaming the files to their destination by placing in front of the name a text previously informed by the user.

But I’m having trouble copying renamed files.

In the script I am running a rsync. I’d like to execute a find to list and copy the structure and files by creating an array, with this could manipulate the destination individually within a loop for or while.

Below follows the folder structure and the script.

Source folders and files:

Template
    00 - Criação
        Arq de Criação.docx
        Arq de Informações.docx
    01 - Iniciação
        Arq de Iniciação.docx
        Arq de Coleta.docx
    02 - Planejamento
        Arq de Planejamento.docx
        Arq de Informações.docx
    03 - Execução
        Arq de Cronograma.docx
        Arq de Mudança.docx
    04 - Controle
        Arq de Entrega Parcial.docx
    05 - Encerramento
        Arq de AS Bult.docx
        Arq de Encerramento.docx

Destination folders and files:

P20190103.0001 - Estrutura nova cliente
    00 - Criação
        P20190103.0001 - Arq de Criação.docx
        P20190103.0001 - Arq de Informações.docx
    01 - Iniciação
        P20190103.0001 - Arq de Iniciação.docx
        P20190103.0001 - Arq de Coleta.docx
    02 - Planejamento
        P20190103.0001 - Arq de Planejamento.docx
        P20190103.0001 - Arq de Informações.docx
    03 - Execução
        P20190103.0001 - Arq de Cronograma.docx
        P20190103.0001 - Arq de Mudança.docx
    04 - Controle
        P20190103.0001 - Arq de Entrega Parcial.docx
    05 - Encerramento
        P20190103.0001 - Arq de AS Bult.docx
        P20190103.0001 - Arq de Encerramento.docx

The code P20190103.0001 is variable and inserted by the user in the execution of the script.

#!/bin/bash
clear

LOCALMOUNTPOINT="/Volumes/Server01"

if mount | grep "on $LOCALMOUNTPOINT" > /dev/null; then
    echo ""
    echo ""
    echo ""
    echo "       Verificando se o volume esta montado.... OK"
    echo ""
    echo ""
    echo ""
    echo "       Informe o nome do projeto...: "
    read PROJETO
    FULLPATHSRC="/Users/xxx/Downloads/Templates/"
    FULLPATHDST="/Users/xxx/Downloads/teste/"$PROJETO"/"
    echo "       Criando estrutura do projeto: " $FULLPATHDST
    if [ -d "$FULLPATHDST" ] 
    then
       echo ""
       echo ""
       echo "      ERROR    "
       echo "     -------   "
       echo ""
       echo "Diretório de destino já existe...:"
       echo "  ---> $FULLPATHDST  <---" 
       echo ""
       echo ""
       echo ""
    else
       mkdir "$FULLPATHDST" > /dev/null;
       rsync -av --progress "$FULLPATHSRC" "$FULLPATHDST"
    fi
else
    echo ""
    echo ""
    echo "                            ERROR                         "
    echo "                           -------                        "
    echo ""
    echo "     Conecte-se ao servidor "Server01.dominio.local/Clientes""
    echo ""
    echo "            .....O volume não esta montado.....           "
    echo ""
    echo ""
    echo ""
fi

1 answer

0

After the execution of rsync you could rotate the find to list all copied files and rename each file individually thus:

# lista todos os arquivos copiados para $FULLPATHDST
find "$FULLPATHDST" -type f > /tmp/files.txt

# manipula cada arquivo indivualmente
while IFS='' read filepath; do
    # obtém o diretório do arquivo
    filedir="${filepath%/*}"
    # obtém o nome do arquivo (sem o diretório)
    filename="${filepath##*/}"
    # renomeia o arquivo conforme a necessidade - adiciona o prefixo
    mv -v "$filepath" "$filedir/P20190103.0001 - $filename"
done < /tmp/files.txt

rm -f /tmp/files.txt

The only problem is that the rsync would not be very efficient the second time your script runs, as all the files would be renamed and the rsync would copy them all again.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.