renomeia vários arquivos em vários diretórios usando o script Bash

2

Eu quero renomear vários arquivos em vários diretórios usando o script Bash. Eu tenho 772 desses diretórios, ou seja, de Nishi_001 para Nishi_772. Cada diretório possui um número diferente de arquivos, mas em todos os diretórios, a nomeação dos arquivos é semelhante à seguinte:

sample_001samout
sample_002samout
sample_003samout
sample_004samout
.
.
sample_00Nsamout  N=maximum 18

Eu quero renomear os arquivos em cada diretório para um nome específico específico para cada diretório, por exemplo, para Nishi_001, ele contém os seguintes arquivos:

sample_001samout
sample_002samout
sample_003samout

a ser renomeado para o seguinte formato:

130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1_001samout
130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1_002samout
130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1_003samout

O novo nome é diferente para cada um dos 772 diretórios. Eu tenho um arquivo contendo uma lista dos novos nomes, por exemplo

Nishi_003="130906_Hiseq3B_l7_003_Dr_Nishikawa_ATGCCTAA_L007_R1"
Nishi_004="130906_Hiseq3B_l7_004_Dr_Nishikawa_AGTGGTCA_L007_R1"
Nishi_005="130906_Hiseq3B_l7_005_Dr_Nishikawa_ACCACTGT_L007_R1"

Todos os arquivos em um diretório específico serão todos renomeados com o mesmo nome que identificará de onde o arquivo veio. esse novo nome substituirá a frase "sample" em todos os arquivos contidos nesse diretório específico.

por exemplo, no diretório Nishi_001, a frase "sample" em todos os arquivos deve ser substituído por

"130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1" 

qual é o novo nome específico para o diretório Nishi_001

    
por alex kiarie 31.03.2016 / 08:50

2 respostas

4

Você precisa fazer uma iteração no arquivo de mapa, lendo o diretório e o nome do padrão em duas variáveis e usando-as no comando mv :

sed 's/"//g' map.txt | 
    while IFS="=" read dir name; do 
        for file in "$dir"/*; do 
            mv "$file" "${file/sample/$name}"
        done
    done 

Explicação

  • sed 's/"//g' map.txt : remova as aspas em torno dos nomes de destino.
  • while IFS="=" read dir name; do : $IFS="=" diz ao seu shell para dividir a entrada em = , então read dir name lerá o diretório de destino na variável $dir e o nome em $name . Como isso é executado na saída do comando sed , isso será igual ao $name sem as aspas.
  • for file in "$dir"/*; do : para cada arquivo em cada $dir .
  • mv "$file" "${file/sample/$name}" : a sintaxe ${var/pattern/replacement} print $var com a string pattern substituída por replacement . Então, aqui, ele irá imprimir o nome do arquivo com sample substituído por qualquer valor atual de $name .
por 04.04.2016 / 10:58
1
#!/bin/bash
for file in sample_00*
do
    replace_name=$(echo $file | sed "s/sample/130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1/g" | cat )
    mv $file $replace_name
done

referência: Como renomear múltiplos arquivos em um único comando ou script no Unix?

    
por 31.03.2016 / 11:01