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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top