Come sostituire gli spazi bianchi in un nome file?


8

l'ho provato nel modo seguente:

rename 'bla bla .txt' blabla.txt

Ma questo non funziona, qual è la sintassi corretta per questo caso?

Risposte:


15

Non dovresti usare renameper rinominare solo un file, usa invece mv(1) .

Inoltre, per sfuggire a Whitepsace, aggiungilo come prefisso \:

"Ubuntu One"Ubuntu\ One

Il tuo comando sarebbe

mv bla\ bla.txt blabla.txt
  • la barra rovesciata dice a bash che il personaggio successivo è in qualche modo speciale, ad esempio \aper "campana", \per uno spazio letterale e così via

    vedi man ascii(7) per di più

In alternativa, poiché ora stai usando il comando corretto mv, puoi citare il nome del file se ci sono molti spazi:

mv "bla    bla.txt" blabla.txt

(Questo sarebbe bla\ \ \ \ bla.txtin forma di escape)

  • In bash, le stringhe tra virgolette (virgolette singole o doppie) vengono trattate come un singolo argomento, mentre le stringhe non quotate verranno suddivise in più argomenti, in questo modo:

    • ["mv", "bla", "bla.txt", "blabla.txt", ]

    e si mvaspetta:

    • ["mv", "source", "destination", ]
  • Nota: digitando 'mv' e i primi caratteri del nome file e premendo si TABotterrà la versione con escape del nome del file, rendendo la ridenominazione semplice e veloce.


renameviene utilizzato per elaborare in batch la ridenominazione dei file utilizzando l'espressione regolare, come dimostrato nell'esempio dalla sua pagina man :

rename 's/\.bak$//' *.bak

Per eliminare qualsiasi occorrenza di .bak (alla fine della stringa [$]) da tutti i file corrispondenti a "* .bak".


grazie, come apparirebbe il comando se ci sono molti spazi nel nome file di origine? c'è una regex semplice in modo che non sia necessario sfuggire a ogni singolo spazio bianco?
NES,

Aggiornata la risposta per indirizzare molti spazi e virgolette singole v. Doppie.
Stefano Palazzo

C'è una differenza tra virgolette singole e doppie, ma non è un problema per questo problema. Vedi questo articolo per i dettagli esatti
Stefano Palazzo

4

rename è un comando specializzato per rinominare in blocco. Inavvertitamente, ciò che normalmente chiamiamo "ridenominazione" è in realtà una "mossa" con un nuovo nome:

mv 'bla bla .txt' blabla.txt

qual è la differenza tra scrivere il nome del file tra virgolette singole e doppie?
NES,

4
La doppia virgoletta consente di espandere le variabili e di sostituirle; la virgoletta singola no. A=bla ; mv "$A $A .txt" blabla.txtsposterà bla bla .txt, ma A=bla ; mv '$A $A .txt' blabla.txtcercherà un file chiamato "$ A $ A .txt". O uno funzionerà per il tuo esempio però.
frabjous,

1
rename "s/\s//g" "bla bla.txt"

s è il comando sostituto sed.

\ s è per whiteSpace

Stai sostituendo con niente. Altrimenti la stringa di sostituzione va dopo la seconda barra.

g è per Global, ovvero sostituisce ogni istanza. L'omissione di g sostituisce solo la prima istanza.


Questo comando sostituirà gli spazi bianchi con trattino basso in tutti i file:

rename "s/\s/_/g" *
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.