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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top