Renomeando arquivos no linux com uma regex

9

Eu tinha um grupo de arquivos que gostaria de renomear de forma consistente. 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"
Osama ALASSIRY
fonte

Respostas:

14

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

Ele aceita um perl regex para renomear:

para isso, digitei apenas dois comandos:

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

Para algumas distribuições, porém, renamenão possui essa funcionalidade (consulte a página de manual) e você pode precisar instalar perl-renameou prename.

Osama ALASSIRY
fonte
resposta muito boa
Judioo
8
Cuidado, algumas distros enviam um comando de renomeação sem valor. Verifique qual a sua distribuição primeiro.
Derobert
Eu sabia mmv, mas, eventualmente, graças a renameeu posso usar o poder de regex
Ludovic Kuty
5
No Arch Linux, é isso perl-rename.
Oleh Prypin
6

Desde que eu não tenho um comando de renomeação, estou contando com isso:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done
Franz Bettag
fonte
5

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

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

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

Hamish Downer
fonte
5

renameutil não é muito "padrão". Cada distribuição é fornecida com uma renameferramenta diferente . Por exemplo, aqui no Gentoo, renameé do sys-apps/util-linuxpacote e não suporta regex.

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

Por outro lado, para o caso geral, você pode querer renomear . Possui qmve qcpcomandos, que abrirão um editor de texto de sua escolha (minha preferência: Vim) e permitirão editar os nomes de arquivos de destino lá. Depois de salvar e fechar o editor, qmv/ qcpfará toda a renomeação.

Ambos mmve qmvsão suficientes inteligente para renomear arquivos em ordem correta e também para detectar renomeações circulares, e fará automaticamente um arquivo temporário, se necessário.

Denilson Sá Maia
fonte
No Gentoo, você também pode criar o sys-apps/renamepacote, que fornece a renamexmrenomeação de regex, além de massas maiúsculas / minúsculas e outras coisas interessantes.
radicando
1

Para ser justo:

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

dá 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 a opção {-n} por {-v}

fpba
fonte
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
bjarkig82
fonte
Em geral, analisar a lssaída não é a melhor ideia. Uma pesquisa aleatória fez essa leitura demorada no Unix. SE para sua diversão. | Além disso, sua resposta corresponderia melhor à pergunta com umtr '[:upper:]' '[:lower:]'
HBruijn