2009-02-17 10 views
0

J'apprends tcl (attendez) et maintenant je suis arrivé à un problème intéressant. J'ai besoin d'une commande pour déplacer/renommer un tas de fichiers avec l'extension .status. J'ai essayé ces:Comment renommer/déplacer tous les fichiers avec une certaine extension?

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

Bien sûr, cela ne fonctionne pas. J'ai googlé un peu et trouvé quelque chose à propos de glob, mais ça ne semble pas fonctionner comme je le 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. C'est comme si toute la liste des fichiers était concaténée en une seule chaîne au lieu d'être traitée séparément. Essayer de trouver plus d'informations via google me conduire à beaucoup de liens brisés et périmés, donc j'espère à côté de résoudre ce problème, pourriez-vous me signaler une bonne ressource en ligne pour tcl/s'attendre à des bases et des pièges communs.

Mise à jour: Seules les solutions utilisant les outils standards tcl et standard dans/bin seront acceptées.

Répondre

1
 
$ 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 
+0

ressemble beaucoup. Pourriez-vous expliquer à un débutant tcl pourquoi [list exec/bin/mv] est nécessaire ici? –

+0

En fait, je pense que cette partie est redondante. Édité. –

+0

Il n'est pas nécessaire d'exécuter un programme externe pour que cela fonctionne. Tcl a des commandes de gestion de fichiers robustes. Bien sûr, si l'exec fonctionne et vous permet de passer à d'autres tâches, c'est génial. Pour les personnes qui ont trébuché sur cette question plus tard, il est important de souligner que vous pouvez le faire de manière multi-plateforme sans avoir recours à exec. –

0

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, non /poubelle.

2
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/ 
0

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

C'est également un moyen de gérer ces fichiers de cas de bords occasionnels manuellement.

3

La réponse de Randy est courte et correcte mais utilise un exec sans nécessité. La réponse de Joseph est très robuste mais un peu longue.

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

changement de nom de fichier {*} [glob * .status] some_dir

Questions connexes