como renomear múltiplos arquivos substituindo string no nome do arquivo? esta string contém um “#”

25

link

link

link

link

Estes artigos mencionados responderam à minha pergunta. No entanto, nenhum deles funciona para mim. Eu suspeito que é porque a string que estou tentando substituir tem um # nela. Existe uma maneira especial de resolver isso?

Eu tenho um arquivo de imagem que foi substituído por # U00a9 durante a migração de um site. Eles são assim:

Lucky-#U00a9NBC-80x60.jpg
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
Lucky-#U00a9NBC-250x250.jpg
Lucky-#U00a9NBC-282x232.jpg
Lucky-#U00a9NBC-300x150.jpg
Lucky-#U00a9NBC-300x200.jpg
Lucky-#U00a9NBC-300x250.jpg
Lucky-#U00a9NBC-360x240.jpg
Lucky-#U00a9NBC-400x250.jpg
Lucky-#U00a9NBC-430x270.jpg
Lucky-#U00a9NBC-480x240.jpg
Lucky-#U00a9NBC-600x240.jpg
Lucky-#U00a9NBC-600x250.jpg
Lucky-#U00a9NBC.jpg

e eu quero mudar isso para algo assim:

Lucky-safeNBC-80x60.jpg
Lucky-safeNBC-125x125.jpg
Lucky-safeNBC-150x150.jpg
Lucky-safeNBC-250x250.jpg
Lucky-safeNBC-282x232.jpg
Lucky-safeNBC-300x150.jpg
Lucky-safeNBC-300x200.jpg
Lucky-safeNBC-300x250.jpg
Lucky-safeNBC-360x240.jpg
Lucky-safeNBC-400x250.jpg
Lucky-safeNBC-430x270.jpg
Lucky-safeNBC-480x240.jpg
Lucky-safeNBC-600x240.jpg
Lucky-safeNBC-600x250.jpg
Lucky-safeNBC.jpg

ATUALIZAÇÃO:

Todos esses exemplos começam com "LU00a9ucky, mas aqui estão muitas imagens com nomes diferentes. Estou segmentando simplesmente a parte" # U00a9 "da string para substituir por" safe ".

    
por Community 19.12.2014 / 22:15

7 respostas

13

Isso não é difícil, simplesmente certifique-se de escapar do octothorpe (#) no nome, colocando uma barra invertida (\).

find . -type f -name 'Lucky-*' | while read FILE ; do
    newfile="$(echo ${FILE} |sed -e 's/\#U00a9/safe/')" ;
    mv "${FILE}" "${newfile}" ;
done 
    
por 19.12.2014 / 23:10
41

Para substituir # por somethingelse para nomes de arquivos no diretório atual (não recursivo), você pode usar o Utilitário GNU rename :

rename  's/#/somethingelse/' *

Caracteres como - devem ser ignorados com \ .

Para o seu caso, você gostaria de usar

rename 's/#U00a9/safe/g' *

Observe que, se você quiser operar apenas em uma determinada seleção de arquivos, por exemplo, somente *.jpg , ajuste a entrada final para corresponder a essa seleção:

rename 's/#U00a9/safe/g' *.jpg

Para realizar um teste antes de alterar nomes de arquivo, use o sinalizador -n :

demo/> ls                               
Lucky-#U00a9NBC-125x125.jpg  
Lucky-#U00a9NBC-150x150.jpg 

demo/> rename -n 's/#U00a9/safe/g' *.jpg
rename(Lucky-#U00a9NBC-125x125.jpg, Lucky-safeNBC-125x125.jpg)
rename(Lucky-#U00a9NBC-150x150.jpg, Lucky-safeNBC-150x150.jpg)

Para o OS X, a renomeação do GNU pode ser instalada usando o homebrew : brew install rename .

    
por 28.08.2016 / 19:52
9

encontre a lista de arquivos e, em seguida, substitua a palavra-chave. abaixo está o exemplo

find . -name '*jpg' -exec bash -c ' mv $0 ${0/\#U00a9NBC/safeNBC}' {} \;

    
por 07.07.2017 / 10:01
7

Para escapar de # do shell, use apenas aspas simples ( '#' ), aspas duplas ( "#" ) ou barra invertida ( \# ).

O mais simples no seu caso seria usar o comando rename (se estiver disponível):

rename '#U00a9' safe *.jpg
    
por 03.06.2016 / 17:03
5

não sabe como usar o sed, mas você pode tentar isso em um shell bash:

for f in Lucky-#U00a9NBC-*.jpg; do mv -v "$f" "${f/#U00a9/safe}"; done;

explicação:

  1. percorre todos os nomes de arquivos correspondentes ao glob (Lucky- # U00a9NBC - *. jpg)
  2. renomeia arquivo usando o comando move (mv)
  3. usa a substituição do parâmetro bash nativo $ {var / Pattern / Replacement} para criar o novo nome ("$ {f / # U00a9 / safe}")

Mais sobre a substituição de parâmetros (que é um IMO altamente subutilizado): link

    
por 19.12.2014 / 23:09
1

Os exemplos acima não estavam funcionando no meu sistema (CentOS 5.6) então eu encontrei um comando (possivelmente mais específico do sistema) que funciona (note: precisa escapar '#' com \ na linha de comando):

rename \#U00a9 safe *.jpg

[Além disso: ainda não tenho reputação suficiente para comentar, portanto, em resposta à pergunta de Nikhil sobre o uso de /g em rename 's/old_string/new_string/g' (colocado nos comentários para outra resposta acima):

Use o modificador g para executar uma substituição 'global' (ou seja, substituir new_string por old_string tantas vezes quanto a ocorrência de old_string). Isso não deve ser necessário na minha resposta porque o rename será aplicado a todos os arquivos especificados com * . Veja o link para uma explicação concisa deste e de outros modificadores.]

    
por 15.08.2018 / 20:36
-1

Outra opção é usar pyRenamer , um aplicativo feito especificamente para renomeação em lote.

Pode ser instalado com sudo apt-get install pyrenamer

Para detalhes de uso, consulte seu arquivo README no GitHub .

    
por 02.09.2016 / 11:06

Tags