Renomeando arquivos no linux com um regex

9

Eu tinha um grupo de arquivos que gostaria de renomear consistentemente, os arquivos são nomeados como

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

E eu os queria como minúsculas, aaaammdd, extensão .log

"system.20090101.log"
"something.20090101.log"
    
por Osama ALASSIRY 07.05.2009 / 11:17

6 respostas

13

Eu costumava escrever scripts perl para fazer isso, até que descobri o comando rename.

Ele aceita um regex perl para fazer a renomeação:

para isso, eu acabei de digitar dois comandos:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log
    
por 07.05.2009 / 11:21
6

Como não tenho um comando para renomear, estou confiando nisso:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done
    
por 31.10.2011 / 16:22
4
O

mmv é um utilitário padrão do Linux para mover / renomear vários arquivos. Está disponível nos repositórios para a maioria das distribuições. Para o seu exemplo acima, você poderia fazer:

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

Para mais informações, leia este artigo debaday ou a página de manual .

    
por 07.05.2009 / 14:20
4

rename util não é muito "padrão". Cada distro é enviada com uma ferramenta rename diferente. Por exemplo, aqui no Gentoo, rename é de sys-apps/util-linux package e não suporta regex.

Hamish Downer sugeriu mmv , parece útil, especialmente para uso dentro de scripts.

Por outro lado, para o caso geral, você pode querer renameutils . Ele tem os comandos qmv e qcp , que abrirão um editor de texto de sua escolha (minha preferência: Vim) e permitirá que você edite os nomes de arquivos de destino lá. Depois de salvar e fechar o editor, qmv / qcp fará toda a renomeação.

Tanto mmv como qmv são inteligentes o suficiente para renomear arquivos na ordem correta e também para detectar renomeações circulares e criarão automaticamente um arquivo temporário, se necessário.

    
por 12.09.2009 / 20:09
1

Para ser justo:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\.$4$3$2.log$//' *.txt

fornece esta saída:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

Mas:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

fornece a saída correta:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

substituindo o {-n} switch por {-v}

    
por 31.10.2011 / 15:11
1

Eu criei um pequeno script bash para fazer isso:

#!/bin/bash

for f in 'ls /path/to/folder'; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file='echo "$new_file" | tr A a'

  # Rename the file
  mv "$f" "$new_file"
done
    
por 28.07.2015 / 18:08