Come rinominare / spostare tutti i file con una determinata estensione?
Domanda
Sto imparando tcl (aspettare) e ora è venuto a una questione interessante. Ho bisogno di un comando per spostare / rinominare un gruppo di file con estensione .status. Ho provato questi:
spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir
Naturalmente, che non ha funzionato. Ho cercato su google un po 'e ho trovato qualcosa su glob, ma non sembra funzionare il modo in cui voglio io. Se faccio:
exec /bin/mv [glob *.status] somedir
mv lamenta che '1.Stato 2.status 3.status ... ecc.' non è un file valido. E 'come se l'intero elenco dei file è concatenato in una singola stringa, invece di essere trattati separatamente.
Cercando di trovare ulteriori informazioni tramite Google mi ha portato a un sacco di link non funzionanti e obsoleti, quindi spero accanto a risolvere questo problema, mi può puntare a qualche buona risorsa online per TCL / aspettarsi basi e gli errori più comuni.
Aggiornamento:. saranno accettate solo le soluzioni che utilizzano TCL serie e strumenti standard a / bin
Soluzione
$ ls -1 1.status 2.status rename.tclsh* some_dir/ two words.status $ cat rename.tclsh #!/usr/local/bin/tclsh eval exec /bin/mv [glob *.status] some_dir $ ./rename.tclsh $ ls -1 rename.tclsh* some_dir/ $ ls -1 some_dir/ 1.status 2.status two words.status
Altri suggerimenti
La risposta di Randy è breve e corretto, ma utilizza un exec senza bisogno. La risposta di Giuseppe è molto robusto, ma un po 'lungo.
Per una risposta breve e idiomatica vorrei usare (richiede Tcl 8.5):
rinomina file {*} [glob * .status] some_dir
proc move_to_dir {filenames dirname} {
foreach filename $filenames {
file rename $filename [file join $dirname [file tail $filename]]
}
}
# Example:
move_to_dir [glob -nocomplain *.status] ~/foo/bar/
Questa soluzione funziona con i file con nomi che contengono spazi, quando c'è un sacco di file etc:
exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir
Ma ha bisogno di trovare e xargs, che sono più spesso in / usr / bin, non / bin.
Come misura di sicurezza quando si usa complesso 'trovare' i comandi e potenzialmente l'eliminazione dei dati mi attengo un 'echo' davanti al comando e la cattura in un file.
Posso quindi controllare i comandi elencati nel file prima di utilizzare 'fonte' per eseguirlo.
E 'anche un modo di gestire quelli occasionali caso limite file manualmente.