Eu tenho um pouco de problema. Um cliente me encarregou da migração de sites de um servidor muito antigo. Não sei como eles chegaram lá, mas há arquivos com '
seus nomes. Existe alguma maneira de renomear o arquivo? mv
parece não fazer o truque.
ls
mostra como 90843_O\\'ConnorPaul_GeneralManager.jpg
Quando eu tento
mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg
ele não faz nada com o >
na nova linha como se estivesse esperando por mais informações.
Se eu tentar
mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg
Eu recebo o erro
mv: não é possível stat '90843_O \' ConnorPaul_GeneralManager.jpg ': esse arquivo ou diretório não existe
Além disso, existe uma maneira simples de mudar \'
para _
todos os arquivos em determinada pasta?
vidir
é uma solução simples para esses tipos de problemas.Respostas:
A conclusão da guia Bash deve poder fazer a coisa certa aqui se você apenas digitar
mv 90843_O
e pressionar tab. Caso contrário, uma maneira de escapar corretamente do nome é:As aspas duplas eliminam a necessidade de escapar do
'
, mas os dois caracteres de barra invertida ainda precisam ser escapados (uma barra invertida extra para cada um faz quatro barras invertidas). Outra opção é:Aqui, colocar as barras invertidas entre aspas simples remove a necessidade de evitá-las, mas você precisa finalizar as aspas simples para adicionar um literal
'
. Isso é escapado após o término das aspas.Observe que o problema aqui está relacionado tanto às barras invertidas no nome quanto às aspas simples. Para substituir a
\\'
sequência (como há duas barras invertidas no nome do arquivo na pergunta, ambas causam problemas) por um sublinhado para todos os arquivos em um diretório usando um loop:O
-i
farámv
alerta se quaisquer arquivos serão substituídos. Usandoprename
(rename
links para isso em muitos sistemas):Remova o
-n
quando estiver feliz, pois está fazendo o que deseja. Observe que os caracteres de barra invertida devem ser escapados dentro da expressão perl aqui, mesmo que haja aspas simples ao redor deles (sem as aspas simples, você precisaria de oito barras invertidas, pois quatro seriam removidas pelo shell e não seriam parte da expressão perl).fonte
Você pode usar
rename
para essas tarefas:Se você deseja substituir
'
para_
que você também pode usar renomeação:fonte
Grrr, @Graeme me venceu, mas vou postar assim mesmo ...
Se você citar o nome do arquivo com aspas duplas, como
mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg
, ele faz o truque; O uso-v
é opcional, mas ele informa o que fez. Eu acredito que há uma segunda maneira além de escapar de todos os caracteres, se isso é possível. A única desvantagem que conheço dessa maneira é que o shell processará o texto, pois não está entre aspas simples, mas não o manipula, pois não é um código interno, e o tempo extra necessário para processar não faz sentido.Apenas testado, você pode ter char como
>
dentro de um texto com aspas duplas e ele será usado como parte do nome do arquivo.Como uma dica para o futuro, você pode usar
./
logo antes do nome do arquivo se houver problemas, como arquivos que começam com um hífen:mv ./-file file
renomearão-file
parafile
. Nesse caso, você não pode citar nem escapar do nome do arquivo, como uma exceção.Curiosamente, eu poderia criar o arquivo
90843_O'ConnorPaul_GeneralManager.jpg
se escapasse da aspas simples\'
, mas não o criaria se não tivesse aspas duplas ou escapado.PS: A conclusão do Bash é outra maneira, ela resolveu o problema do nome do arquivo com o seu arquivo, mas não funcionará com os arquivos / pastas "trace": basta escrever uma parte do nome e pressionar Tab, faz o resto.
fonte