2013-05-08 19 views
11

Ho una situazione in cui ho bisogno di andare ogni giorno oltre 400 file in una cartella su Xsan e sostituire gli spazi con sotto-punteggi nei nomi dei file dei file.Rimuovere gli spazi dai nomi di file nella cartella

Qualcuno ha uno script a portata di mano che posso eseguire tramite il terminale, ad esempio, che farà questo per me?

risposta

30

Qui si va, questo scorre tutti i file (e cartelle) nella directory corrente:

for oldname in * 
do 
    newname=`echo $oldname | sed -e 's/ /_/g'` 
    mv "$oldname" "$newname" 
done 

Noti prego che questo sarà sovrascrivere i file con lo stesso nome. Cioè, se ci sono due file che hanno nomi di file altrimenti identici, ma uno ha underscore (s) dove l'altro ha spazio (s). In quella situazione, quello che aveva underscore sarà sovrascritto con quello che aveva spazi. Questa versione più lunga salterà invece questi casi:

for oldname in * 
do 
    newname=`echo $oldname | sed -e 's/ /_/g'` 
    if [ "$newname" = "$oldname" ] 
    then 
    continue 
    fi 
    if [ -e "$newname" ] 
    then 
    echo Skipping "$oldname", because "$newname" exists 
    else 
    mv "$oldname" "$newname" 
    fi 
done 
+0

Qual è la funzione delle virgolette nel comando mv? Quella linea equivale a mv $ (oldname) $ (newname)? –

+0

Senza le doppie virgolette, i nomi di file con spazi causerebbero problemi. E no, non equivalente. La sintassi '$()' è per la sostituzione di comando: https://en.wikipedia.org/wiki/Command_substitution –

+1

ghhhaaaa Voglio farlo in modo ricorsivo e colpire anche tutti i sottodir ... –