Qual é o código bash para remover caracteres variados em um nome de arquivo até certo ponto?

Qual é o código bash para remover caracteres variados em um nome de arquivo até certo ponto?

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 S514e 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 *.fastqno 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 mvestá 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 renameutilitários (aquele baseado no File::Renamemó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 -nopção quando tiver certeza de que ela faz a coisa certa.

informação relacionada