https://serverfault.com/questions/70939/how-to-replace-a-text-string-in-multiple-files-in-linux
https://serverfault.com/questions/228733/how-to-rename-multiple-files-by-replacing-word-in-file-name
https://serverfault.com/questions/212153/replace-string-in-files-with-fficient-file-extension
https://serverfault.com/questions/33158/searching-a-number-of-files-for-a-string-in-linux
Todos esses 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 uma migração de site. Estes 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 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
ATUALIZAR:
Todos esses exemplos começam com "LU00a9ucky, mas aqui estão muitas imagens com nomes diferentes. Estou simplesmente direcionando a parte" # U00a9 "da string para substituir por" safe ".
rename
comando Eu suspeito que seu renomear seria tão simples quantorename -n 's/#/safeNBC/' *.jpg
.rename -n 's/#U00a9/safe/' *.jpg
e o comando foi aceito, mas nenhuma alteração ocorreu.-n
é ano act
opção. O que permite ver se funciona antes de você realmente usá-lo. A saída na tela mostrou os possíveis novos nomes corretamente?Respostas:
Para substituir
#
porsomethingelse
nomes de arquivos no diretório atual (não recursivo), você pode usar o utilitário de renomeação GNU :Caracteres como
-
devem ser escapados com a\
.Para o seu caso, você gostaria de usar
Observe que se você deseja operar apenas em uma certa seleção de arquivos, por exemplo, apenas
*.jpg
, ajuste a entrada final para corresponder a essa seleção:Para executar um teste antes de alterar os nomes dos arquivos, use o
-n
sinalizador:Para OS X, GNU renomeação pode ser instalado usando homebrew :
brew install rename
.fonte
rename
você está usando?# sudo pacman -S perl-rename
instalará a versão perl, que é mais poderosa e pode ser suficiente para fazer esta resposta funcionar para você.rename --version
retornarename from util-linux 2.29.2
para que de fato não seja a versão perl.rename
utilitários comuns, mas nenhum deles é desenvolvido pelo GNU: As distribuições baseadas no Debian incluem umrename
utilitário com seu pacote Perl, enquanto as distribuições baseadas no Red Hat usam orename
utilitário dautil-linux
Organização do Kernel do Linux. Seu link é para a funçãorename
C da biblioteca padrão GNU./g
emrename 's/#U00a9/safe/g' *
encontre a lista de arquivos e substitua a palavra-chave. abaixo está um exemplo
fonte
mv
argumentos, caso haja espaços no nomeIsso não é difícil, basta escapar do octothorpe (#) no nome, colocando uma barra invertida (\).
fonte
#
sons como o que eu preciso. Não vejo uma barra invertida no seu exemplo. Deve ficar assim: #s/\#U00a9/safe/
Para escapar
#
do shell, use aspas simples ('#'
), aspas duplas ("#"
) ou barra invertida (\#
).O mais simples no seu caso seria usar o
rename
comando (se estiver disponível):fonte
rename 's/#/somethingelse/' *
) não funcionou na minha máquina (Arch Linux), esta funcionou.não sabe como sed, mas você pode tentar isso em um shell bash:
explicação:
Mais sobre a substituição de parâmetros (que é IMO altamente subutilizada): http://www.tldp.org/LDP/abs/html/parameter-substitution.html
fonte
Os exemplos acima não estavam funcionando no meu sistema (CentOS 5.6), então encontrei um comando (possivelmente mais específico do sistema) que funciona (nota: é necessário escapar de '#'
\
na linha de comando):rename \#U00a9 safe *.jpg
[Também: ainda não tenho reputação suficiente para comentar, portanto, em resposta à pergunta de Nikhil sobre o uso de
/g
inrename 's/old_string/new_string/g'
(apresentada nos comentários para outra resposta acima):Use o
g
modificador para executar uma substituição 'global' (ou seja, para substituir new_string por old_string quantas vezes ocorrer old_string). Isso não deve ser necessário na minha resposta, porque orename
será aplicado a todos os arquivos especificados com*
. Consulte https://www.computerhope.com/unix/rename.htm para obter uma explicação concisa deste e de outros modificadores.]fonte
rename
sistemas operacionais derivados do Debian. Consulte unix.stackexchange.com/a/238862/135943 . E, a propósito, o CentOS 5.6 é bastante antigo e eu recomendo que você atualize.Aqui está a solução da DTK envolvida na função reutilizável do bash:
Veja como você pode usá-lo:
fonte
Na verdade,
rename
tem uma opção exatamente para aquela chamada--subst
ou-s
resumida. Não há necessidade de usar a sintaxe regex.Se você deseja substituir / substituir várias ocorrências, use
--subst-all
ou-S
.BTW, eu só queria substituir uma string por nada (remova-a do nome do arquivo) ... bem, também temos uma opção para ela
-d/--delete
e-D/--delete-all
:fonte
Outra opção é usar
pyRenamer
, um aplicativo criado especificamente para renomear em lote.Pode ser instalado com
sudo apt-get install pyrenamer
Para detalhes de uso, consulte o arquivo LEIA-ME no GitHub .
fonte