Como renomear esses arquivos com regex?

5

Não consigo escrever um código de regex para isso. O Microsoft Windows alterou os nomes dos meus arquivos e eu quero remover a data desses nomes.

Como posso fazer isso? (Os nomes estão abaixo.)

icon-culture (2015_09_04 06_58_44 UTC).png
icon-disk (2015_09_04 06_58_44 UTC).png
icon-download (2015_09_04 06_58_44 UTC).png
icon-drop (2015_09_04 06_58_44 UTC).png
icon-file (2015_09_04 06_58_44 UTC).png
icon-film (2015_09_04 06_58_44 UTC).png
icon-flag (2015_09_04 06_58_44 UTC).png
icon-folder (2015_09_04 06_58_44 UTC).png
icon-garbage (2015_09_04 06_58_44 UTC).png
icon-graph (2015_09_04 06_58_44 UTC).png
icon-heart (2015_09_04 06_58_44 UTC).png
icon-help (2015_09_04 06_58_44 UTC).png
icon-lock (2015_09_04 06_58_44 UTC).png
icon-map (2015_09_04 06_58_44 UTC).png
icon-media (2015_09_04 06_58_44 UTC).png
icon-money (2015_09_04 06_58_44 UTC).png
icon-monitor (2015_09_04 06_58_44 UTC).png
icon-notes (2015_09_04 06_58_44 UTC).png
icon-openmail (2015_09_04 06_58_44 UTC).png
icon-phone (2015_09_04 06_58_44 UTC).png
icon-photo (2015_09_04 06_58_44 UTC).png

Os tutoriais não foram bem para mim. Porque há algum caráter especial e números unidos.

    
por Interesting Knox 12.03.2016 / 10:23

4 respostas

13

Você pode usar o comando rename :

$ rename -n 's/ \(.*?\)//' *.png
icon-culture (2015_09_04 06_58_44 UTC).png renamed as icon-culture.png
icon-disk (2015_09_04 06_58_44 UTC).png renamed as icon-disk.png
icon-download (2015_09_04 06_58_44 UTC).png renamed as icon-download.png
icon-drop (2015_09_04 06_58_44 UTC).png renamed as icon-drop.png
icon-file (2015_09_04 06_58_44 UTC).png renamed as icon-file.png
icon-film (2015_09_04 06_58_44 UTC).png renamed as icon-film.png
icon-flag (2015_09_04 06_58_44 UTC).png renamed as icon-flag.png
icon-folder (2015_09_04 06_58_44 UTC).png renamed as icon-folder.png
icon-garbage (2015_09_04 06_58_44 UTC).png renamed as icon-garbage.png
icon-graph (2015_09_04 06_58_44 UTC).png renamed as icon-graph.png
icon-heart (2015_09_04 06_58_44 UTC).png renamed as icon-heart.png
icon-help (2015_09_04 06_58_44 UTC).png renamed as icon-help.png
icon-lock (2015_09_04 06_58_44 UTC).png renamed as icon-lock.png
icon-map (2015_09_04 06_58_44 UTC).png renamed as icon-map.png
icon-media (2015_09_04 06_58_44 UTC).png renamed as icon-media.png
icon-money (2015_09_04 06_58_44 UTC).png renamed as icon-money.png
icon-monitor (2015_09_04 06_58_44 UTC).png renamed as icon-monitor.png
icon-notes (2015_09_04 06_58_44 UTC).png renamed as icon-notes.png
icon-openmail (2015_09_04 06_58_44 UTC).png renamed as icon-openmail.png
icon-phone (2015_09_04 06_58_44 UTC).png renamed as icon-phone.png
icon-photo (2015_09_04 06_58_44 UTC).png renamed as icon-photo.png

s/ \(.*?\)// é uma expressão simples, se ampla, que corresponde a um espaço seguido por material entre parênteses. Você pode escolher expressões mais precisas como:

  • s/ \(.*?\)\.png$/.png/ - como o anterior, mas correspondendo apenas se seguido por .png e o final do nome do arquivo ou
  • s/ \(\d{4}(_\d\d){2} \d\d(_\d\d){2} UTC\)\.png/.png/ - corresponde ao padrão de data mostrado nesses arquivos e seguiu .png .

A opção -n é para testar o comando. Corra sem ela se estiver satisfeito com os resultados.

    
por muru 12.03.2016 / 10:35
4

Usando a expansão do parâmetro bash :

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

${file%% *} descartará a parte indesejada do nome do arquivo a partir do espaço. Em seguida, a extensão .png é adicionada após o nome do arquivo, enquanto mv -ing.

    
por heemayl 12.03.2016 / 10:59
3

Você pode tentar o seguinte snippet de código em Python

import os
import glob
files = glob.glob('*')
for file in files:
    var1 = file.find(' (')
    var2 = file.find(')')+1
    filename = file[:var1] +  file[var2:]
    os.rename(file, filename)
  • glob localiza todos os arquivos que satisfazem o argumento regex
  • Você percorre a lista e modifica o nome do arquivo
  • rename altera o nome do arquivo
por gokul_uf 12.03.2016 / 10:38
3

Usando bash e expansão de parâmetro, execute o seguinte código no mesmo diretório em que você possui os arquivos.

for file in *.png ; do NAME="${file%%\ \(*}"; EXT="${file##*.}" ; mv "$file" "$NAME"."$EXT"   ; done  

Execução de amostra

$> ls                                                                                                                             
icon-culture (2015_09_04 06_58_44 UTC).png  icon-disk (2015_09_04 06_58_44 UTC).png
$> for file in *.png ; do NAME="${file%%\ \(*}"; EXT="${file##*.}" ; mv "$file" "$NAME"."$EXT"   ; done                               
$> ls
icon-culture.png  icon-disk.png
    
por Sergiy Kolodyazhnyy 12.03.2016 / 10:43