Mudar o nome do ficheiro com aspas 'no nome


11

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? mvparece 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?


1
Se você tiver moreutils , vidiré uma solução simples para esses tipos de problemas.
Derobert

Respostas:


6

A conclusão da guia Bash deve poder fazer a coisa certa aqui se você apenas digitar mv 90843_Oe pressionar tab. Caso contrário, uma maneira de escapar corretamente do nome é:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

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 é:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

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:

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

O -ifará mvalerta se quaisquer arquivos serão substituídos. Usando prename( renamelinks para isso em muitos sistemas):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

Remova o -nquando 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).


4

Você pode usar renamepara essas tarefas:

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

Se você deseja substituir 'para _que você também pode usar renomeação:

rename "s/\'/_/g" *

-2

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 filerenomearão -filepara file. 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.jpgse 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.


Por que voto negativo? Eu estava escrevendo antes dos outros, mas não fui rápido o suficiente para publicá-lo primeiro.
rautamiekka

Não fui eu. Nenhuma pista de quem votou.
Igor Yavych 06/04

1
Esta resposta não está correta, pois ignora as barras invertidas no nome do arquivo, que são realmente mais difíceis de lidar do que as aspas simples.
Graeme
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.