Frage

Ich lerne tcl (erwarten), und nun kam ich auf ein interessantes Thema. Ich brauche einen Befehl an eine Reihe von Dateien mit der Erweiterung .status verschieben / umbenennen. Ich habe versucht, diese:

spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir

Natürlich, das hat nicht funktioniert. Ich googeln ein wenig und fand etwas über glob, aber es scheint nicht die Art und Weise arbeiten ich es will. Wenn ich das tue:

exec /bin/mv [glob *.status] somedir

mv beklagt, dass '1.Status 2.status 3.status ... etc.' ist keine gültige Datei. Es ist, als ob die ganze Liste von Dateien in einem einzigen String verketteten ist, anstatt separat behandelt werden.

Der Versuch, mehr Informationen über Google führen Sie mich über gebrochene und veraltete Links zu viel zu finden, so hoffe ich, dieses Problem neben der Lösung, könnten Sie mir zeigen auf einige gute Online-Ressource für Tcl / erwarten Grundlagen und allgemeine Probleme.

Update:. Nur Lösungen, die Standard Tcl und Standard-Tools in / bin verwenden akzeptiert werden

War es hilfreich?

Lösung

$ 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

Andere Tipps

Randy Antwort ist kurz und richtig, aber verwendet eine exec ohne Notwendigkeit. Josephs Antwort ist sehr robust, aber ein bisschen zu lang.

Für eine kurze und idiomatische Antwort, die ich benutzen würde (erfordert Tcl 8.5):

Dateiumbenennungs- {*} [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/

Diese Lösung arbeitet mit Dateien, deren Namen mit Leerzeichen, wenn es eine Menge von Dateien etc:

exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir

Aber es braucht und xargs finden, die am häufigsten sind in / usr / sind, nicht / ist.

Als ein Sicherheitsmerkmal, wenn komplexe mit Befehlen ‚finden‘ und möglicherweise Daten zu löschen Ich bleibe ein ‚Echo‘ vor dem Befehl und erfassen sie in einer Datei.
Ich kann dann die Befehle in der Datei aufgelistet überprüfen, bevor ‚Quelle‘ mit, um sie auszuführen.

Es ist auch ein Weg, um den gelegentlichen Randfalles Handhabung Dateien manuell.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top