Question

J'apprends tcl (attendre) et maintenant je suis venu à une question intéressante. J'ai besoin d'une commande pour déplacer / renommer un groupe de fichiers avec l'extension .status. J'ai essayé ces:

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

Bien sûr, cela ne fonctionne pas. Je googlé un peu et trouvé quelque chose glob, mais il ne semble pas fonctionner comme je veux. Si je fais:

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

mv se plaint que '1.Etat 2.status 3.status ... etc.' n'est pas un fichier valide. Comme si la liste complète des fichiers est concaténés dans une seule chaîne au lieu d'être traité séparément.

Essayer de trouver plus d'informations via google me conduire à beaucoup de liens brisés et dépassés, donc j'espère à côté de résoudre ce problème, pourriez-vous me pointer vers une bonne ressource en ligne pour tcl / expect bases et les pièges courants.

Mise à jour:. Seules les solutions qui utilisent tcl standard et des outils standard dans / bin seront acceptées

Était-ce utile?

La solution

$ 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

Autres conseils

La réponse de Randy est court et correct, mais utilise un exec sans besoin. La réponse de Joseph est très robuste mais un peu long.

Pour une réponse courte et idiomatiques j'utiliser (nécessite Tcl 8.5):

renommage de fichiers {*} [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/

Cette solution fonctionne avec des fichiers avec des noms contenant des espaces, quand il y a beaucoup de fichiers, etc:

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

Mais il faut trouver et xargs qui sont le plus souvent dans / usr / bin, pas / bin.

En fonction de sécurité lors de l'utilisation des commandes complexes « trouver » et la suppression des données potentiellement je colle un « écho » devant la commande et la capture dans un fichier.
Je peux alors vérifier les commandes répertoriées dans le fichier avant d'utiliser « source » pour l'exécuter.

Il est aussi une façon de traiter les cas occasionnels bord fichiers manuellement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top