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

2

Quero renomear vários arquivos em vários diretórios usando o script Bash. Eu tenho 772 tais diretórios, ou seja, de Nishi_001 a 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

para 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 diretórios 772. 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 renomeados com o mesmo nome que identificará a origem do arquivo. esse novo nome substituirá a frase "amostra" em todos os arquivos contidos nesse diretório específico.

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

"130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1" 

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

alex kiarie
fonte
Todos os diretórios Nishi estão contidos em um diretório pai?
Arronical 31/03
Qual sistema operacional você está usando? Você marcou com o Linux, mas qual? Por favor edite sua pergunta para responder e também dar-nos um exemplo de seu "names_to_replace", eu não consigo entender o que você precisa para mudar o nome ao que.
terdon
Sim. Todo o Nishi diretórios contidos em um diretório pai Eu estou usando Linux 2.6.32-504.3.3.el6.x86_64
alex Kiarie
O novo nome é diferente para cada um dos diretórios 772. Eu tenho um arquivo que contém uma lista dos novos nomes. Todos os arquivos em um diretório específico serão renomeados com o mesmo nome que identificará a origem do arquivo. esse novo nome substituirá a frase "amostra" em todos os arquivos contidos nesse diretório específico.
alex Kiarie

Respostas:

4

Você precisa iterar sobre seu arquivo de mapa, lendo o diretório e o padrão de nome em duas variáveis ​​e usando-os no mvcomando:

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 ao redor dos nomes de destino.
  • while IFS="=" read dir name; do: $IFS="="diz ao seu shell para dividir a entrada =; assim read dir name, o diretório de destino será lido na variável $dire o nome em $name. Como isso é executado na saída do sedcomando, será o mesmo $namesem as aspas.
  • for file in "$dir"/*; do: para cada arquivo em cada $dir.
  • mv "$file" "${file/sample/$name}": a sintaxe é ${var/pattern/replacement}impressa $varcom a sequência patternsubstituída por replacement. Portanto, aqui, ele imprimirá o nome do arquivo samplesubstituído por qualquer que seja o valor atual de $name.
terdon
fonte
me derrote. minha versão é quase idêntica, exceto que usei sed em vez de ${file/sample/$name}, e usei em $prefixvez de $name. +1
cas
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 vários arquivos em um único comando ou script no Unix?

DonBit
fonte
Isso funciona se eu fizer isso para um diretório de cada vez. O novo nome é diferente para cada um dos diretórios 772.
alex Kiarie