Cómo renombrar / mover todos los archivos con una extensión determinada?
Pregunta
Estoy aprendiendo TCL (esperar) y ahora llegó a un tema interesante. Necesito un comando para mover / cambiar el nombre de un grupo de archivos con la extensión .status. Probé siguientes:
spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir
Por supuesto, eso no funcionó. Busqué en Google un poco y encontré algo de pegote, pero no parece funcionar de la manera que quiero que haga. Si hago:
exec /bin/mv [glob *.status] somedir
mv se queja de que '1.Estado 2.status 3.Estado ... etc.' no es un archivo válido. Es como si toda la lista de archivos se concatena en una sola cadena en lugar de ser tratados por separado.
El intentar encontrar más información a través de Google me llevan a una gran cantidad de enlaces rotos y obsoletos, así que estoy esperando junto a la solución de este problema, que me podría apuntar a un buen recurso en línea para tcl / cuente con fundamentos y las trampas comunes.
Actualización:. Sólo se aceptarán soluciones que utilizan TCL estándar y herramientas estándar en / bin
Solución
$ 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
Otros consejos
La respuesta de Randy es corta y correcta, pero utiliza un ejecutivo sin necesidad. La contestación de José es muy robusto, pero un poco larga.
Para obtener una respuesta corta e idiomático Me gustaría utilizar (requiere Tcl 8.5):
archivo de cambio de nombre {*} [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/
Esta solución funciona con archivos con nombres que contengan espacios, cuando hay una gran cantidad de archivos, etc:
exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir
Pero es necesario encontrar y xargs que son con mayor frecuencia en / usr / bin, no / bin.
Como medida de seguridad cuando se utiliza compleja 'encontrar' comandos y, potencialmente, la eliminación de datos me pego un 'eco' en frente del comando y la captura en un archivo.
entonces puedo comprobar los comandos que aparecen en el archivo antes de usar 'fuente' para ejecutarlo.
Es también una manera de manejar los casos ocasionales borde archivos manualmente.