Como copiar arquivos de múltiplos diretórios, adicionando o nome da pasta pai ao nome do arquivo?

1

Eu tenho procurado todas as respostas possíveis sobre "copiar arquivos de vários diretórios para um único diretório", mas não consigo encontrar minha resposta. Eu preciso de algo um pouco mais específico para o meu tratamento de banco de dados.

Eu tenho uma pergunta semelhante para:

copiando arquivos de múltiplos diretórios para outro diretório múltiplo

mas como posso copiar esses arquivos (todos eles têm exatamente o mesmo nome) para um novo diretório e adicioná-los ao nome do diretório pai, para que eu possa reconhecer de qual diretório eles foram copiados?

Sim, eu poderia copiar e renomear cada um dos nomes um após o outro, se eu não tivesse 100 deles :)

Eu testei loops com find. etc, mas ainda assim, não posso adicionar os arquivos copiados ao nome do diretório dos pais.

Eu ainda sou júnior neste campo e estou começando com a regex. Eu acho que há algo para fazer aqui com eles, mas não consigo descobrir exatamente como.

Então, esta é minha pergunta graficamente. Como fazer isso com um comando simples ou um loop no meu terminal unix:

DIR_a1 --> output_file.bam
DIR_a2 --> output_file.bam                              
DIR_a3 --> output_file.bam  

Copie todos os output_files.bam em NEWDIR_output para que eles apareçam com o nome do diretório pai:

output_file_a1.bam
output_file_a2.bam                              
output_file_a3.bam

De antemão, muito grato por qualquer entrada

    
por Marylaure 06.07.2016 / 09:01

2 respostas

2

Copiando arquivos de uma origem para um diretório de destino, adicionando o nome da pasta contendo ao arquivo

O script abaixo copiará os arquivos recursivamente de um diretório de origem para um diretório flat , adicionando o nome do diretório superior (direto) ao nome do arquivo. O nome do diretório será inserido antes possível extensão no arquivo, exatamente como o seu exemplo.

O script

#!/usr/bin/env python3
import os
import sys
import shutil

for root, dirs, files in os.walk(sys.argv[1]):
    for f in files:
        # split off the superior directory's name
        dirname = root.split("/")[-1]
        # define file+path, possible extension position
        src = os.path.join(root, f); spl = f.rfind(".")
        # defining new filename
        newname = f[:spl]+"_"+dirname + f[spl:] if spl != -1 else f+"_"+dirname
        # copy the file into the new directory
        shutil.copyfile(src, os.path.join(sys.argv[2], newname))

Como usar

  1. Copie o script em um arquivo vazio, salve-o como copyandrename.py
  2. Execute-o com os diretórios de origem e de destino como argumentos:

    python3 /path/to/copyandrename.py <source_directory> <target_directory>
    

    Meu comando de teste foi, por exemplo,

    python3 '/home/jacob/Bureaublad/pscript_4.py' '/home/jacob/Bureaublad/testmap' '/home/jacob/Bureaublad/target'
    

Como sempre, teste primeiro uma amostra!

    
por Jacob Vlijm 06.07.2016 / 09:49
2

Você deve conseguir fazer isso usando os recursos de substituição de parâmetros do shell, por exemplo,

$ for d in DIR_a*; do echo cp -- "$d/output_file.bam" "NEWDIR_OUTPUT/output_file${d#DIR}.bam"; done
cp DIR_a1/output_file.bam NEWDIR_OUTPUT/output_file_a1.bam
cp DIR_a2/output_file.bam NEWDIR_OUTPUT/output_file_a2.bam
cp DIR_a3/output_file.bam NEWDIR_OUTPUT/output_file_a3.bam

Remova o echo depois de verificar se está fazendo a coisa certa.

    
por steeldriver 06.07.2016 / 13:48