Rinominare il file che ha ottenuto un segno di virgolette 'nel suo nome


11

Ho avuto un piccolo problema. Un client mi ha incaricato della migrazione di siti da un server molto vecchio. Non so come ci siano arrivati, ma ci sono file con 'nei loro nomi. C'è un modo per rinominare il file? mvnon sembra fare il trucco.

ls lo mostra come 90843_O\\'ConnorPaul_GeneralManager.jpg

Quando ci provo

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

non fa nulla con il >nella nuova riga come se stesse aspettando più input.

Se ci provo

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

Ottengo l'errore

mv: impossibile stat '90843_O \' ConnorPaul_GeneralManager.jpg ': nessun file o directory

Inoltre, esiste un modo semplice per passare \'a _tutti i file in determinate cartelle?


1
Se hai maggiori informazioni , vidirè una soluzione semplice a questo tipo di problemi.
derobert,

Risposte:


6

Il completamento della scheda Bash dovrebbe essere in grado di fare la cosa giusta qui se digiti mv 90843_Oe premi tab. Altrimenti, un modo per sfuggire correttamente al nome è:

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

Le doppie virgolette rimuovono la necessità di sfuggire a ', ma i due caratteri di barra rovesciata devono ancora essere sfuggiti (una barra rovesciata in più per ciascuna fa quattro barre rovesciate). Un'altra opzione è:

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

Qui inserendo le barre rovesciate tra virgolette singole si elimina la necessità di sfuggirle, ma è necessario terminare le virgolette singole per aggiungere un valore letterale '. Questo è evaso dopo la fine delle virgolette.

Nota che il problema qui ha a che fare con le barre rovesciate nel nome come la singola citazione. Per sostituire la \\'sequenza (poiché ci sono due barre rovesciate nel nome file nella domanda, entrambe causeranno problemi) con un carattere di sottolineatura per tutti i file in una directory usando un ciclo:

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

La -ifarà mvpronta se tutti i file saranno sovrascritti. Utilizzo prename( renamecollegamenti a questo su molti sistemi):

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

Rimuovi -nquando sei felice che sta facendo quello che vuoi. Si noti che i caratteri di barra rovesciata dovrebbero essere salvati all'interno dell'espressione perl qui, anche se ci sono virgolette singole intorno a loro (senza le virgolette singole sarebbero necessarie otto barre rovesciate poiché quattro sarebbero rimosse dalla shell e non faranno parte dell'espressione perl).


4

È possibile utilizzare renameper tali attività:

➜  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 si desidera sostituire 'per _è possibile utilizzare anche rinomina:

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

-2

Grrr, @Graeme mi ha battuto, ma posterò comunque ...

Se citate il nome del file con virgolette doppie, come mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg, fa il trucco; l'utilizzo -vè facoltativo ma dirà cosa ha fatto. Credo che ci sia un secondo modo oltre a sfuggire a tutti i caratteri, anche se è possibile. L'unico aspetto negativo che conosco in questo modo è che la shell elaborerà il testo poiché non è racchiuso tra virgolette singole, ma non lo manipola affatto poiché non è un codice interno e il tempo aggiuntivo necessario per l'elaborazione non ha senso.

Appena testato, puoi avere char come >all'interno di un testo tra virgolette doppie e verrà preso come parte del nome del file.

Come suggerimento per il futuro, puoi usare ./subito prima del nome del file se dà problemi, come i file che iniziano con un trattino: mv ./-file fileverranno rinominati -filein file. In questo caso non puoi citare né sfuggire al nome del file, come eccezione.

Stranamente, potrei creare il file 90843_O'ConnorPaul_GeneralManager.jpgse sfuggissi alla singola virgoletta di \', ma non lo creerebbe se non fosse tra virgolette doppie o sfuggito.

PS: Il completamento di Bash è un altro modo, ha aggirato il problema del nome del file con il tuo file, ma non funziona con file / cartelle "trattini": basta scrivere una parte del nome e premere Tab, fa il resto.


Perché votare? Stavo scrivendo prima degli altri, ma non ero abbastanza veloce per farlo pubblicare prima.
rautamiekka,

Non sono stato io. Nessun indizio su chi abbia votato.
Igor Yavych,

1
Questa risposta non è corretta, ignora le barre rovesciate nel nome del file che in realtà sono più difficili da gestire rispetto alla singola citazione.
Graeme,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.