https://serverfault.com/questions/212153/replace-string-in-files-with-fficient-file-extension
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:
e eu quero mudar para algo assim:
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 ".
Então, o que você realmente tentou? Vejo que você se vinculou a algumas perguntas e disse que elas falharam, mas como elas falharam? IMO, o melhor exemplo usa o renamecomando Eu suspeito que seu renomear seria tão simples quanto rename -n 's/#/safeNBC/' *.jpg.
Eu tentei rename -n 's/#U00a9/safe/' *.jpge o comando foi aceito, mas nenhuma alteração ocorreu.
Claro, como você já viu na documentação que certamente revisou, esta -né a no actopçã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?
Peço desculpas por ter copiado e colado o seu exemplo sem prestar total atenção, fiz o comando renomear sem o -n. Acredito que o @DTK resolva o problema, não estava escapando do #.
Substituindo cadeias de nomes de arquivos no MacOS: superuser.com/questions/152627/…
Para substituir #por somethingelsenomes 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 -nsinalizador:
Para OS X, GNU renomeação pode ser instalado usando homebrew : brew install rename.
Isso não funcionou na minha máquina (Arch Linux), mas a resposta de mik funcionou.
@marcvangend Qual versão renamevocê está usando? # sudo pacman -S perl-renameinstalará a versão perl, que é mais poderosa e pode ser suficiente para fazer esta resposta funcionar para você.
@JohnGowers Thanks! Eu não sabia que existem duas versões. No meu sistema, rename --versionretorna rename from util-linux 2.29.2para que de fato não seja a versão perl.
— Marcvangend 20/05
Existem dois renameutilitários comuns, mas nenhum deles é desenvolvido pelo GNU: As distribuições baseadas no Debian incluem um renameutilitário com seu pacote Perl, enquanto as distribuições baseadas no Red Hat usam o renameutilitário da util-linuxOrganização do Kernel do Linux. Seu link é para a funçãorename C da biblioteca padrão GNU.
Nesta resposta, por que temos que escrever /gemrename 's/#U00a9/safe/g' *
encontre a lista de arquivos e substitua a palavra-chave. abaixo está um exemplo
— Sujit Dhamale
Você precisa de aspas duplas em torno de seus mvargumentos, caso haja espaços no nome
Eu precisava substituir todos os arquivos * _spec.rb para * _controller_spec.rb e sua solução funcionou para mim. Thanx.
Isso não é difícil, basta escapar do octothorpe (#) no nome, colocando uma barra invertida (\).
Sua explicação faz sentido, escapando dos #sons como o que eu preciso. Não vejo uma barra invertida no seu exemplo. Deve ficar assim: # s/\#U00a9/safe/
@LeonFrancisShelhamer good catch. Engoliu a barra invertida. Eu vou modificar.
Para escapar #do shell, use aspas simples ( '#'), aspas duplas ( "#") ou barra invertida ( \#).
O mais simples no seu caso seria usar o renamecomando (se estiver disponível):
Obrigado. Enquanto a resposta mais votada ( rename 's/#/somethingelse/' *) não funcionou na minha máquina (Arch Linux), esta funcionou.
Isso funciona usando o comando rename do util-linux.
— imclean
não sabe como sed, mas você pode tentar isso em um shell bash:
percorre todos os nomes de arquivos correspondentes ao glob (Lucky- # U00a9NBC - *. jpg)
renomeia o arquivo usando o comando move (mv)
usa a substituição nativa do parâmetro bash $ {var / Pattern / Replacement} para criar o novo nome ("$ {f / # U00a9 / safe}")
Mais sobre a substituição de parâmetros (que é IMO altamente subutilizada): http://www.tldp.org/LDP/abs/html/parameter-substitution.html
— Gregory Patmore
Embora esse código possa responder à pergunta, ele não é muito útil por si só. Explicar como resolve o problema melhoraria a utilidade e o valor a longo prazo da resposta.
explicação passo a passo adicionada e leituras adicionais conforme o comentário de Anthony.
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):
[Também: ainda não tenho reputação suficiente para comentar, portanto, em resposta à pergunta de Nikhil sobre o uso de /gin rename 's/old_string/new_string/g'(apresentada nos comentários para outra resposta acima):
Use o gmodificador 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 o renameserá 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.]
— Ezra Citron
Corrigir; Os sistemas operacionais derivados do Fedora, como o CentOS, têm uma versão diferente dos renamesistemas 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.
Ah, obrigado pela explicação + link. O sistema operacional desatualizado é no trabalho e por isso não depende de mim para atualizar :) mas um novo cluster está sendo construído e, presumivelmente, vamos atualizar quando passar ...
Aqui está a solução da DTK envolvida na função reutilizável do bash:
Na verdade, renametem uma opção exatamente para aquela chamada --substou -sresumida. Não há necessidade de usar a sintaxe regex.
Se você deseja substituir / substituir várias ocorrências, use --subst-allou -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/--deletee -D/--delete-all:
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 .
— Sajna T
Se você realmente acha que isso poderia responder à pergunta, adicione algumas explicações à sua resposta. Por si só, instala apenas um pacote. Você deve explicar o que o comando faz e fornecer um exemplo que lide com os requisitos específicos do OP.