renomeia arquivos com o comando rename

2

Por favor, avise o que há de errado com o seguinte comando

find /tmp/dir -name "* *" -type f | rename 's/*/fixed_/g'

remark - Eu prefiro fazer isso com um comando que não é sintaxe de loop

O que eu quero é renomear todos os arquivos em / tmp / dir, adicionando o nome fixed _ antes de cada arquivo

Por exemplo (os arquivos)

Fevc.txt
Ddve.txt

Deve renomear para:

fixed_Fevc.txt
fixed_Ddve.txt
    
por maihabunash 03.09.2014 / 09:50

3 respostas

4

Nota temporária: há algo errado - o padrão renomear não manipula nomes de arquivo com caminho; Estou trabalhando em uma correção

O que está errado em seu comando é duas coisas:

find /tmp/dir -name "* *" -type f | rename 's/*/fixed_/g'

  • O -name "* *" corresponde apenas aos nomes dos arquivos com um espaço - não é isso que você quer, certo?

    • a solução é simplesmente deixar de fora; Não queremos excluir arquivos que correspondam a algum nome - queremos todos.
  • O padrão rename está errado de duas formas

    • você usou um padrão shell glob, mas ele precisa ser uma expressão regular, em suma, um regex (pode ser alguma expressão perl geral - vamos ignorá-la e usar apenas s///g )
    • o padrão fixo corresponderia ao nome completo e o substituiria por fixed_ . Você deseja "substituir" os "primeiros 0 caracteres" por fixed_ , tecnicamente. Esse é o começo da linha, correspondido com ^ . Podemos deixar de fora o g porque há apenas uma substituição necessária por linha.

Juntando tudo, parece assim:

find /tmp/dir -type f | rename 's/^/fixed_/'

    
por 03.09.2014 / 11:25
1

Parece que seu sistema apresenta a versão mais antiga de renomear que não usa expressões regulares. Você pode renomear seus arquivos com

cd /tmp/dir/
for f in *\ * ; do
    [[ -f $f ]] && mv "$f" fixed_"$f"
done

(não testado)

Para o comando renomear com suporte a regex, é necessário alterar a expressão regular : * precisa de algo para operar, significa "repetir o anterior zero ou mais vezes". Você não quer substituir nada, você quer prefixar, então use ^ , que significa o começo da string:

rename 's/^/fixed_/'
    
por 03.09.2014 / 10:04
1

Se alguém estiver interessado em uma solução zsh

 cd /tmp/dir
 for f (*(.)) mv $f fixed_$f

onde (.) significa somente arquivos

Um caso mais simples

 for f (*.txt) mv $f fixed_$f
    
por 03.09.2014 / 11:24