![Qual é o código bash para remover caracteres variados em um nome de arquivo até certo ponto?](https://rvso.com/image/169414/Qual%20%C3%A9%20o%20c%C3%B3digo%20bash%20para%20remover%20caracteres%20variados%20em%20um%20nome%20de%20arquivo%20at%C3%A9%20certo%20ponto%3F.png)
Eu tenho um conjunto de arquivos que variam em caracteres. Por exemplo:
IDNR19_15_037_S514_L001_R1_001.fastq
IDNR19_02_016_S238_L001_R1_001.fastq
Eu gostaria de remover todos os personagens até o ponto S514
e S238
, mantendo tudo o que vem depois. Isso é possível quando os arquivos têm números diferentes, como mostrado no meu exemplo?
Existem cerca de 1.100 arquivos, portanto, fazer isso manualmente consumiria muito tempo.
O mais próximo que consegui fazer foi:
rename 's/IDNR19_//g' *.fastq
para remover a parte IDNR19_, mas isso não resolve meu problema.
Responder1
Supondo que sejam nomes de arquivos no disco que você deseja renomear, e não strings armazenadas em uma variável ou em um arquivo de texto. Você pode usar um loop de shell simples:
for name in *.fastq; do
newname=${name#*_*_*_}
printf 'Would move "%s" to "%s"\n' "$name" "$newname"
# mv -i -- "$name" "$newname"
done
Isso percorre todos os nomes que correspondem ao padrão *.fastq
no diretório atual (você pode querer ser mais específico com esse padrão, por exemplo, alterando-o para IDNR*.fastq
). Para cada nome de arquivo, ele constrói um novo nome removendo o prefixo que corresponde ao padrão globbing do nome do arquivo *_*_*_
. Isso é feito usandouma expansão de parâmetro padrão.
Por segurança, o mv
está comentado. Você deve executar o código uma vez para ver se ele faz a coisa certa antes de ativar o mv
.
Usando um dos vários rename
utilitários (aquele baseado no File::Rename
módulo Perl; existem vários diferentes, consulte "O que há com todas as renomeações: pré-nomear, renomear, renomear arquivo?"):
rename -n -v 's/.*?_.*?_.*?_//' -- *.fastq
ou mais curto,
rename -n -v 's/(.*?_){3}//' -- *.fastq
Isso faz mais ou menos a mesma coisa que o código shell acima, mas usando uma substituição Perl. A substituição remove os bits iniciais da string do nome do arquivo, combinando as três substrings entre os sublinhados usando uma .*
correspondência não gananciosa. Remova a -n
opção quando tiver certeza de que ela faz a coisa certa.