Como aparar o nome do arquivo de vários arquivos dentro de uma pasta

1

Eu tenho uma pasta com vários arquivos de imagem PNG. Eu preciso cortar os nomes dos arquivos para remover algumas informações do final.

Por exemplo,

some file-170227-222746.png
some other file-170228-222742.png
another file-170226-222743.png

Eu preciso remover tudo após o - enquanto retendo a extensão .png, para acabar com:

some file.png
some other file.png
another file.png

Todos os arquivos são arquivos de imagem PNG e não é necessário manter os arquivos originais.

Eu tentei isso, que funciona, mas faz a coisa errada, na medida em que remove a extensão .png

for file in *.png; do
  mv -- "$file" "$(file%%.png"
done

O comando mv acima pode ser retrabalhado para fazer o que eu preciso? Devo usar um método diferente?

Obrigado

    
por Frank 12.03.2017 / 13:00

3 respostas

1

Sua abordagem no caminho certo só precisa de alguma precisão. Você poderia fazer isso:

for file in ./*.png; do  mv  "$file"  "${file%%-*}.png";  done
    
por 12.03.2017 / 13:26
0

Se você tiver acesso ao script perl rename , também poderá usar

rename -n 's/(.*).{14}(\.png)/$1$2/' *

Remova -n após o teste para realmente renomear os arquivos.

Notas

  • -n imprime o que será alterado, na verdade não faz nada
  • s/old/new replace old com new
  • (.*) salva todos os caracteres nessa posição para mais tarde
  • .{14} exatamente 14 caracteres
  • (\.png) save .png
  • $1$2 imprime o primeiro padrão salvo e o segundo padrão salvo
por 12.03.2017 / 13:27
0

Obrigado por toda a ajuda a todos.

A melhor solução que tenho é:

for file in ./*.png; do  
mv  "$file"  "${file%%-17*}.png";  done

Observe o -17. Isso evita o problema de os arquivos serem cortados demais quando eles têm um traço inicial antes da área que eu preciso cortar.

Por exemplo,

some file-name-170227-222746.png

é cortado para:

some file-name.png

Em vez de:

some file.png
    
por 12.03.2017 / 16:16

Tags