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
fonte
Respostas:
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
mv
comando: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=
; assimread dir name
, o diretório de destino será lido na variável$dir
e o nome em$name
. Como isso é executado na saída dosed
comando, será o mesmo$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}
impressa$var
com a sequênciapattern
substituída porreplacement
. Portanto, aqui, ele imprimirá o nome do arquivosample
substituído por qualquer que seja o valor atual de$name
.fonte
${file/sample/$name}
, e usei em$prefix
vez de$name
. +1referência: Como renomear vários arquivos em um único comando ou script no Unix?
fonte