Ho un gruppo di file che hanno :
(due punti) all'interno del nome. Devo sostituire il :
con -
(trattino).
C'è un modo semplice per farlo in uno script?
Nome file di esempio: 2013-10-11:11:52:08_055456663_045585_.txt
Ho un gruppo di file che hanno :
(due punti) all'interno del nome. Devo sostituire il :
con -
(trattino).
C'è un modo semplice per farlo in uno script?
Nome file di esempio: 2013-10-11:11:52:08_055456663_045585_.txt
Risposte:
Un semplice 1-liner dovrebbe fare (presuppone che sh
shell compatibile con Posix ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Spiegazione:
for ... in ...; do ...; done
è un ciclo
*:*
corrisponde a tutti i file e directory nella directory corrente che hanno il :
loro nome
f
viene assegnato a sua volta a ciascuno di tali nomi di file nel loop
mv
rinomina il suo primo argomento nel secondo; -v
(verboso) gli chiede di stampare ciò che fa; questa opzione è specifica per GNU-utils , quindi è disponibile su Linux ma non su Solaris
$(...)
esegue il codice in una sotto-shell e sostituisce l'output
echo
stampa il suo argomento sull'output standard
tr
legge l'output standard e traduce i caratteri in base alla mappa fornita
Se stai usando bash , puoi evitare di generare una shell extra ( $()
) con sottoprocessi ( tr
) sostituendola $(...)
con ${f//:/-}
.
Sono sicuro che un professionista UNIX potrebbe farlo con bash, ma ecco la mia versione veloce e sporca con ruby.
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
impostare path_to_files sul percorso dei file con nome errato. salva il codice sopra in un file chiamato rename.rb quindi:
username@machinename$ ruby rename.rb
Se hai solo uno o pochi file, questo può fare la ridenominazione per te:
p="201*"
.old_name=$(ls | grep $p)
.Memorizza il nuovo nome file con i necessari sostituzioni di caratteri:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
Pulizia bonus :
a. Se per motivi di uniformità si desidera sostituire i trattini (-
) insieme ai due punti (:
) con caratteri di sottolineatura (_
), è possibile farlo:
new_name=$(ls | grep $p | tr ':-' '_');
b. Se vuoi che anche l'ultimo carattere di sottolineatura (poco prima del .txt
) sia andato, imposta la new_name
variabile come:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB: mv
fallirà se uno dei nomi dei file nell'operazione di ridenominazione contiene spaces
. In tal caso, racchiudi le variabili appropriate tra virgolette, come: mv "$old_name" $new_name
OR mv $old_name "$new_name"
OR mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
Questo può essere eccessivo ma puoi rinominare qualsiasi carattere speciale con lo script al link fornito in questa risposta:
for f in
ciclo ... è un ciclo che scorre su tutti i file nella directory corrente in cui i file devono corrispondere*:*
. (Cosa succede con le directory che corrispondono?). Il comando move è una novità oldname newname in cui il nuovo nome viene generato eseguendo una shell con$( subshell here )
. Cosa fa tr ...