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 shshell 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
mvrinomina 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_namevariabile come:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB: mvfallirà 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 inciclo ... è 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 ...