Renomeando arquivos dentro de pastas

1

Eu tenho várias pastas, onde cada pasta contém dois arquivos fastq.gz. Geralmente eles são denominados como sample_R1.fastq.gz e sample_R2.fastq.gz. onde sample_ pode representar o nome da pasta ou outra coisa.

Mas no meu caso, as pastas são:

1008_a
2085_a
2130_a
2192_a
2221_a
2242_a
2269_a
2482_a

E cada uma dessas pastas consiste nesses arquivos como:

1008_a Arquivos : C85CBANXX_s6_1_O07_0452_SL137634.fastq.gz C85CBANXX_s6_2_O07_0452_SL137634.fastq.gz

2085_a:

C7V65ANXX_s6_1_M19_0413_SL131164.fastq.gz C7V65ANXX_s6_2_M19_0413_SL131164.fastq.gz

Como posso renomear esses arquivos para exatamente como 1008_a_R1.fastq.gz & 1008_a_R2.fastq.gz para a pasta 1008_a

2085_a_R1.fastq.gz, 2085_a_R2.fastq.gz para a pasta 2085_a

E assim por diante, já que todas as outras pastas têm diferentes tipos de padrões dentro delas.

Obrigado Ron

    
por Ron 07.11.2017 / 00:42

1 resposta

1
Solução

find + bash :

Exemplo de estrutura de pastas (por exemplo, 1080_a e 2085_a ):

$ tree 1008_a/ 2085_a/
1008_a/
├── C85CBANXX_s6_1_O07_0452_SL137634.fastq.gz
└── C85CBANXX_s6_2_O07_0452_SL137634.fastq.gz
2085_a/
├── C7V65ANXX_s6_1_M19_0413_SL131164.fastq.gz
└── C7V65ANXX_s6_2_M19_0413_SL131164.fastq.gz

O trabalho:

find . -type f -regextype posix-egrep \
-regex ".*/[0-9]{4}_a/[[:alnum:]_]+_[12]_[[:alnum:]_]+\.fastq\.gz$" -exec bash -c \
'path=${0%/*}/; bn=${0##*/}; dir_n=${0%/*}; dir_n=${dir_n##*/}; 
 new_fn=$(sed -E "s/.+_([12])_.+(\.fastq\.gz)$/${dir_n}_R/" <<<"$bn"); 
 mv "$0" "$path$new_fn"' {} \;

Resultados:

$ tree 1008_a/ 2085_a/
1008_a/
├── 1008_a_R1.fastq.gz
└── 1008_a_R2.fastq.gz
2085_a/
├── 2085_a_R1.fastq.gz
└── 2085_a_R2.fastq.gz
    
por 07.11.2017 / 09:44