Se o nome do arquivo tiver mais de n caracteres, exclua os últimos

0

Sou meio novo no shell do Unix e não consigo encontrar a resposta do meu problema:

Eu tenho uma pasta contendo vários arquivos: um nome de arquivo correto contém exatamente 13 caracteres (números + letras + sublinhado). Por exemplo:

1305359000_PS.JPG

Alguns arquivos são nomeados incorretamente, estando o erro sempre nos últimos caracteres, como:

9009015000_PS_1.jpg

Eu preciso executar um comando localizar / substituir que funcione dessa forma para todos os arquivos da minha pasta:

SE nome do arquivo > 13 caracteres (sem a extensão), em seguida, exclua todos os caracteres após o 13º.

Eu tentei alguns comandos com mmv e awk , mas estou preso até agora.

Editar: esqueci de precisar, o comando deve considerar o (s) espaço (s) no nome do arquivo e excluí-los, se houver.

    
por AdW 17.03.2016 / 11:13

2 respostas

2

Supondo que você esteja usando um shell bash

(shopt -s globstar; rename --no-act 's/^(.{13}).*/$1\.jpg/' **/*)

O (....) é para que a opção shopt -s globstar se aplique apenas a este comando - se por algum motivo você já não tiver a globbing. Se estiver usando zsh

rename --no-act 's/^(.{13}).*/$1\.jpg/' **/*

a opção --no-act dará uma prévia do que rename potencialmente fará.
Se você estiver satisfeito com as alterações propostas, remova -no-act e seus arquivos serão renomeados em massa.

    
por 17.03.2016 / 11:40
0

Pode haver outra solução mais rápida disponível. Este código não considera o nome do arquivo com espaço.  Mas você pode experimentar o código abaixo:

SHW@SHW:/tmp # for i in 'find /home/user -type f'
do
      mv $i 'echo $i | cut -c -13'.'$i | rev | cut -d'.' -f 1 | rev'
done
    
por 17.03.2016 / 11:25