Domanda

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

È stato utile?

Soluzione

Questo dovrebbe farlo:

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

Altri suggerimenti

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

rename "s/ /_/g" *

Puoi eseguire una corsa a secco con il flag -n:

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

Usa sh ...

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

Se vuoi provarlo prima di premere il grilletto, cambia mv in echo mv .

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

Beh, ho appena trovato la risposta da solo. Nessuna soluzione più elegante (cerca di rinominare anche i file che non soddisfano la condizione) ma funziona. (A proposito, nel mio caso avevo bisogno di rinominare i file con '% 20', non con un carattere di sottolineatura)

#!/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

Se usi bash:

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

Cita le tue variabili:

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

Rimuovi " echo " per fare il vero nome.

Prova qualcosa del genere, supponendo che tutti i tuoi file fossero .txt:

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

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

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

Spero che questo aiuti.

Ecco un'altra soluzione:

ls | awk '{printf("\"%s\"\n", <*>)}' | 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 caratteri di sottolineatura; stampa il nome originale tra virgolette (da awk); quindi il nome sostituito
  3. xargs prende 2 righe alla volta e le passa a mv

Per rinominare tutti i file con estensione .py , trova . -iname " *. py " -tipo f | xargs -I% rinomina " s / / _ / g " & Quot;% "

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top