Renomeando o arquivo que recebeu uma marca de aspas 'em seu nome

9

Eu tenho um pequeno problema. Um cliente me encarregou da migração de sites de um servidor realmente antigo. Não sei como chegaram lá, mas há arquivos com ' em seus nomes. Existe alguma maneira de renomear o arquivo? mv não parece 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

não faz nada com o > na nova linha, como se esperasse mais entradas.

Se eu tentar

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

Eu recebo o erro

mv: cannot stat '90843_O\'ConnorPaul_GeneralManager.jpg': No such file or directory

Além disso, existe uma maneira simples de alterar \' para _ em todos os arquivos em determinada pasta?

    
por Igor Yavych 06.04.2014 / 16:08

3 respostas

3

O término da aba Bash deve ser capaz de fazer a coisa certa aqui se você apenas digitar mv 90843_O e pressionar a tecla tab. Caso contrário, uma maneira de escapar do nome é:

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

As aspas duplas removem 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 elimina a necessidade de escapar delas, mas você precisa terminar as aspas simples para adicionar um literal ' . Isso é escapado após o término das aspas.

Observe que o problema aqui tem tanto a ver com as barras invertidas no nome quanto nas aspas simples. Para substituir a sequência \' (já que há duas barras invertidas no nome do arquivo na pergunta, ambos causarão problemas) com um sublinhado para todos os arquivos em um diretório usando um loop:

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

O -i fará com que mv seja solicitado se algum arquivo for sobrescrito. Usando prename ( rename links para isso em muitos sistemas):

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

Remova o -n quando estiver satisfeito e fazendo o que deseja. Observe que os caracteres de barra invertida devem ter escape dentro da expressão perl aqui, mesmo que haja aspas simples ao redor deles (sem as aspas simples você precisaria de oito barras invertidas, já que quatro seriam removidas pelo shell e não faziam parte da expressão perl).

    
por 06.04.2014 / 16:21
4

Você pode usar rename para 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ê quiser substituir ' para _ , também poderá usar renomear:

rename "s/\'/_/g" *
    
por 06.04.2014 / 16:25
-1

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; usar -v é opcional, mas dirá o que fez. Eu acredito que há um segundo caminho além de escapar de todos os personagens, se é que isso é possível. A única desvantagem que conheço é que o shell processará o texto, já que não está entre aspas simples, mas não o manipula, pois não é um código interno, e o tempo extra que leva para processar não tem sentido. / p>

Apenas testado, você pode ter char como > dentro de um texto com aspas duplas e 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 traço: mv ./-file file renomeará -file para file . Nesse caso, você não pode citar nem escapar do nome do arquivo, como uma exceção.

Por incrível que pareça, eu poderia criar o arquivo 90843_O'ConnorPaul_GeneralManager.jpg se eu escapei da cota única por \' , mas ela não iria criá-lo se não fosse citado duas vezes ou tivesse escapado.

PS: A conclusão do Bash é outra maneira, ele resolveu o problema do nome do arquivo com o arquivo, mas não funcionará com arquivos / pastas "traço": basta escrever uma parte do nome e clicar em Tab, ele faz o resto .

    
por 06.04.2014 / 16:24