Linux: sostituzione di spazi nei nomi dei file


96

Ho un numero di file in una cartella e desidero sostituire ogni carattere di spazio in tutti i nomi di file con trattini bassi. Come posso raggiungere questo obiettivo?

Risposte:


172

Questo dovrebbe farlo:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

Questo non ha funzionato per me. Ha affermato che esistevano file identici (con nomi di file sbagliati). Ad esempio, provando a rinominare 1 - foo.jpge la mia cartella era già 1.jpgpresente.
byxor

3
Trovo che i backtick siano un po 'difficili da leggere quando sono vicini alle virgolette. Lo stesso ma più leggibile sarebbefor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron

Nota: viene eseguito dall'INTERNO della directory di cui si desidera aggiornare i nomi dei file. In alternativa, puoi passare *a PATH_TO_YOUR_DIRECTORY.
CFitz

72

Preferisco usare il comando 'rinomina', che accetta regex in stile Perl:

rename "s/ /_/g" *

Puoi fare un dry run con la bandiera -n:

rename -n "s/ /_/g" *

3
questo funzionerà se hai il rinomina in stile Perl e non quello più semplice redhat / fedora
David Dean

9
la versione fedora sarebberename " " "_" *
David Dean

4
renamenon disponibile in OSX appare.
Etienne Low-Décarie

Su macOS 10.12.3, renameè disponibile.
Sung Cho

1
@DavidDean Il rename su Arch Linux sostituirà solo la prima occorrenza (non molto conveniente per file / directory con più spazi). Ha la stessa sintassi di Fedora, quindi sospetto che possano essere la stessa. Ma perl-rename può essere installato.
prosoitos

15

Usa sh ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

Se vuoi provarlo prima di premere il grilletto, mvpassa a echo mv.


4

Se usi bash:

for file in *; do mv "$file" ${file// /_}; done

quando ho provato, ho ottenuto mv: quando sposti più file, l'ultimo argomento deve essere una directory Prova mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help 'per maggiori informazioni.
Mithun Sreedharan,

Di nuovo errore mv: argomento del file mancante Prova mv --help' for more information. mv: missing file argument Try mv --help 'per maggiori informazioni. mv: argomento del file mancante Prova mv --help' for more information. mv: missing file argument Try mv --help 'per maggiori informazioni.
Mithun Sreedharan,

@ levislevis85: Thx, non lo sapevo.
soulmerge

4

Cosa succede se si desidera applicare l'attività di sostituzione in modo ricorsivo ? Come lo faresti?

Beh, ho appena trovato la risposta da solo. Non è la soluzione più elegante, (cerca anche di rinominare i file che non rispettano la condizione) ma funziona. (A proposito, nel mio caso avevo bisogno di rinominare i file con "% 20", non con un trattino basso)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done

2

Prova qualcosa di simile, supponendo che tutti i tuoi file fossero .txt:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

2
ha ricevuto il seguente errore tr: devono essere fornite due stringhe quando si traduce mv: argomento file mancante Prova `mv --help 'per maggiori informazioni.
Mithun Sreedharan,

2
Agin error tr: troppi argomenti Prova tr --help' for more information. mv: missing file argument Try mv --help 'per maggiori informazioni.
Mithun Sreedharan,

2

Ecco un'altra soluzione:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. usa awk per aggiungere virgolette attorno al nome del file
  2. usa sed per sostituire lo spazio con trattini bassi; stampa il nome originale tra virgolette (da awk); quindi il nome sostituito
  3. xargs prende 2 righe alla volta e le passa a mv

1

Cita le tue variabili:

for file in *; do echo mv "'$file'" "${file// /_}"; done

Rimuovere l '"eco" per eseguire la ridenominazione effettiva.


Sta facendo eco ai comandi mv prperly, ma non rinomina veramente il file!
Mithun Sreedharan,

la rimozione di echo produce errori come mv: can't stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': Nessun file o directory di questo tipo mv: can't stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': Nessun file o directory di questo tipo
Mithun Sreedharan,

Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP ven 14 agosto 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

Il modo più semplice per sostituire una stringa (carattere spazio nel tuo caso) con un'altra stringa in Linuxsta usando sed. Puoi farlo come segue

sed -i 's/\s/_/g' *

Spero che questo ti aiuti.


Questo non risponde alla domanda.
amit


0

Per rinominare tutti i file con .pyun'estensione utilizzare, find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

Output di esempio,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
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.