Como alterar arquivos com uma palavra específica para terminar in.fasta

1

Como eu seleciono e modifico arquivos que têm uma palavra específica para todos, em ".fasta"?

Por exemplo, estou selecionando arquivos com a palavra "carro".

find /home/user -name "*car*"

que me dá

/home/user/car.txt
/home/user/scar.fa
/home/user/cart.fa
/home/user/scart.fasta

mas não sei como alterá-los para que todos terminem em ".fasta"

Então o resultado final seria

/home/user/car.fasta
/home/user/scar.fasta
/home/user/cart.fasta
/home/user/scart.fasta
    
por Maurice 03.11.2017 / 15:33

3 respostas

0

Eu recomendaria usar o comando rename as na opção -exec de find :

find /home/user -name "*car*" -exec rename 's/[^.]*$/fasta/' {} \;

O [^.]*$ corresponde a todos os não pontos no final do nome do arquivo e os substitui pela extensão fasta .

Se você não conhece o comando, dê uma olhada em man rename .

    
por 03.11.2017 / 15:45
0

Para uma solução bash, veja esta visão geral da remoção da substring .

#!/bin/bash

for f in *car*; do
   [[ ${f##*.} == "fasta" ]] && continue

   f_no_ext="${f%%.*}"

   if [[ -e "${f_no_ext}.fasta" ]]; then
      echo "Not moving $f because it would clobber ${f_no_ext}.fasta"
      continue
   fi

   mv "$f" "${f_no_ext}.fasta"
done

exit

Isso faz um loop em todos os arquivos *car* e os renomeia para uma extensão .fasta, pulando aqueles que já terminam em .fasta. Acho que outras soluções podem estar negligenciando essa etapa.

EDIT: Adicionei o bloco if para verificar se o arquivo com extensão .fasta já existe para evitar a substituição de arquivos. Por exemplo, se você tiver car.txt e car.fasta.

    
por 03.11.2017 / 16:20
0

Outra maneira de usar um loop e o comando mv :

find /home/user -type f -name "*car*" | while read f; do mv -v "$f" "${f%.*}.fasta"; done
    
por 03.11.2017 / 16:50