Este script deve fazê-lo:
#!/bin/sh
for f in Dorn_Triatom* ; do
mv "$f" 'echo "$f" | sed -e 's/Dorn_Triatomine_//' -e 's/sequence_1_unmappedforTdim_//''
done
Eu tenho a seguinte lista de arquivos:
Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.alleles.tsv Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.matches.tsv Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.snps.tsv Dorn_Triatomine_A5201_sequence_1_unmappedforTdim_tdim.tags.tsv Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.alleles.tsv Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.matches.tsv Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.snps.tsv Dorn_Triatomine_T9252_sequence_1_unmappedforTdim_tdim.tags.tsv
Eu gostaria de eliminar algumas das sequências repetitivas e renomear o arquivo da seguinte forma:
A5201_tdim.alleles.tsv A5201_tdim.matches.tsv A5201_tdim.snps.tsv
Eu tentei usar:
mv Dorn_Triatomine_*_sequence_1_unmappedforTdim_tdim.tags.tsv *_tdim.tags.tsv
Qual seria a maneira mais simples de realizar essa tarefa?
Usando grep
com o PCRE para obter o novo nome de arquivo:
#!/bin/bash
for file in *.tsv; do
newname="$(grep -Po '^[^_]*_[^_]*_\K[^_]*_'<<<"$file")$(grep -Po '.*_\K.*$' <<<"$file")"
mv "$file" "$newname"
done
newname
é combinado de saída de duas operações grep
:
grep -Po '^[^_]*_[^_]*_\K[^_]*_'<<<"$file"
produzirá as A5201_
como sequências de caracteres de cada nome de arquivo
$(grep -Po '.*_\K.*$' <<<"$file")
corresponderá à última parte do nome do arquivo, depois da última _
$()
é o padrão de substituição do comando bash
.
Tags bash rename text-processing