Uma tentativa de copiar arquivos específicos para pastas específicas

0

Este script copia todos os arquivos para todas as pastas. Mas estou lutando para construir uma instrução de condição que especificará para qual pasta cada arquivo é copiado. Eu tentei a declaração if mas nenhuma cópia foi feita.

O motivo pelo qual eu uso expansão de parâmetro é porque os nomes dos arquivos são: Long_John_Silver, Miss_Havisham e Master_Pip e os nomes das pastas são como Long, Miss e Master. Então, basicamente, estou tentando copiar os arquivos para suas respectivas pastas, por exemplo, Master_Pip.fna.gz na pasta chamada Master. Então, o que tentei fazer foi capturar a primeira palavra do nome do arquivo e usá-lo de alguma forma como referência.

for fldr in /home/scripts/playground/genomes_2/* ; do
    find . -name *fna.gz | while read f ; do
        basenm=${fldr##*/} ; f_name=${basenm%%_*} ; 
        cp -r $f /home/scripts/playground/port/$f_name/ ;
    done
done

Este é o meu script com a instrução if, mas este script não copia nada.

for fldr in /home/scripts/playground/genomes_2/* ; do
    find . -name *fna.gz | while read f ; do
        basenm=${fldr##*/} ; f_name=${basenm%%_*} ; 
        if [ "$f_name" == /home/scripts/playground/port/"$f_name" ] ; then
            cp -r $f /home/scripts/playground/port/"$f_name"/ ;
        else
            continue    
        fi
    done
done
    
por Mr Keystrokes 06.03.2018 / 13:08

2 respostas

0

Eu percebi que estava copiando todos os arquivos em todas as pastas com base no tipo de arquivo, ou seja, .fna.gz, então eu especifiquei que tipo de arquivo fna.gz eu quero ler e depois copiei. Não há necessidade de uma instrução if, pois a especificidade está implícita na expansão do parâmetro. Agora funciona perfeitamente.

for fldr in /home/scripts/playground/genomes_2/* ; do

basenm=${fldr##*/} ; f_name=${basenm%%_*} ; 

find . -name $f_name*fna.gz | while read f ; do

    cp -r $f /home/scripts/playground/port/$f_name/ ;



done

done
    
por 06.03.2018 / 16:35
1

1. Altere este código

basenm=${fldr##*/};

para este

basenm=${f##*/} ;

e remova a opção -r do comando copy

cp $f /home/scripts/playground/port/"$f_name"

Talvez você tenha alguns caminhos de origem desordenados como este /home/scripts/playground/genomes_2/Long_John_Silver/Master_Pip.fna.gz. Então, quando você está extraindo f_name do nome da pasta fldr você recebe 'Long'. Então você copia Master_Pip.fna.gz para a pasta .... / Long. 2.

"$f_name" == /home/scripts/playground/port/"$f_name"

eles não são iguais e não vão.

Basicamente, seu primeiro roteiro é bom. A condição é redundante porque você faz isso implicitamente pela expansão de parâmetros.

Eu adicionaria apenas o comando de criação de diretório antes de copiar. Portanto, você sempre terá um diretório para copiar para o caso de uma nova pessoa aparecer no diretório de origem, Shorty_Pete, por exemplo.

mkdir -p /home/scripts/playground/port/"$f_name"
cp ...
    
por 06.03.2018 / 13:23

Tags