Como excluir um caractere / letra do nome do arquivo

0

Eu estou olhando para alterar um lote de nomes de arquivos para remover uma carta, assim:

Stain-A_1P.fastq  to Strain-A_1.fastq
Strain-A_2P.fastq  to  Strain-A_2.fastq

Eu tentei o seguinte:

rename 's/P//' *fastq
for file in *; do mv "$file" 'echo $file | tr 'P' ''' ; done
    
por AudileF 20.06.2017 / 13:55

2 respostas

1

Com bash ou qualquer outro shell POSIX:

for f in *.fastq; do ext="${f##*.}"; echo mv -- "$f" "${f%?.*}.${ext}"; done
  • for f in *.fastq itera sobre os arquivos .fastq

  • ext="${f##*.}" gets ( ${f##*.} ) e salva a extensão do arquivo como variável ext

  • ${f%?.*} obtém a parte até o caractere que segue um caractere antes da última .

  • mv "$f" "${f%?.*}.${ext}" faz a operação de renomeação, com o acréscimo da extensão com o prefixo cortado

Esta é uma corrida a seco; solte echo para ação real:

for f in *.fastq; do ext="${f##*.}"; mv -- "$f" "${f%?.*}.${ext}"; done

Se você tiver rename ( prename ):

rename -n 's{^(./.*).(\..*)}{$1$2}s' ./*.fastq
  • Estamos aproveitando a correspondência gananciosa com .* para corresponder à parte até o último .

  • O primeiro grupo capturado contém a parte até o segundo último caractere antes de .

  • O segundo grupo capturado contém a parte após o último . (incluindo o . )

Largue -n para a ação real:

rename 's{^(./.*).(\..*)}{$1$2}s' ./*.fastq

Exemplo:

% ls -1d -- *.fastq
Stain-A_1P.fastq
Strain-A_2P.fastq

% for f in *.fastq; do ext="${f##*.}"; echo mv -- "$f" "${f%?.*}.${ext}"; done 
mv -- Stain-A_1P.fastq Stain-A_1.fastq
mv -- Strain-A_2P.fastq Strain-A_2.fastq

% rename -n 's{^(./.*).(\..*)}{$1$2}s' ./*.fastq
rename(./Stain-A_1P.fastq, ./Stain-A_1.fastq)
rename(./Strain-A_2P.fastq, ./Strain-A_2.fastq)
    
por 20.06.2017 / 14:01
0

Use o comando rename :

for f in *.fastq; do rename 's/P\./\./' "$f" ; done
  • 's/P\./\./ - perl expressão de substituição: remove P seguido por . (antes da extensão do arquivo)
por 20.06.2017 / 14:02