Cambiar el nombre de archivos con espacios en un shell BusyBox

Cambiar el nombre de archivos con espacios en un shell BusyBox

Estoy intentando cambiar el nombre de algunos archivos en mi Synology Diskstation a través de SSH. El shell disponible es el shell integrado de BusyBox:

BusyBox v1.16.1 (2013-04-16 20:13:10 CST) built-in shell (ash)

El comando mover siempre produce dos errores cuando intento usar un carácter de espacio en el nombre del archivo de origen o de destino. Escapar de espacios o citar el nombre del archivo parece no tener ningún efecto.

Ejemplo para cambiar el nombre de un archivo con un carácter de espacio en el destino:

/volumeUSB1/usbshare/directory $ touch test
/volumeUSB1/usbshare/directory $ ls
test
/volumeUSB1/usbshare/directory $ mv test 'te st'
mv: can't rename 'test': No such file or directory
mv: can't rename 'te': No such file or directory
/volumeUSB1/usbshare/directory $ mv test te\ st
mv: can't rename 'test': No such file or directory
mv: can't rename 'te': No such file or directory

Cambiar el nombre de un archivo con un carácter de espacio en la fuente produce resultados similares:

/volumeUSB1/usbshare/directory $ touch 'te st'
/volumeUSB1/usbshare/directory $ ls
te st
/volumeUSB1/usbshare/directory $ mv 'te st' test
mv: can't rename 'te': No such file or directory
mv: can't rename 'st': No such file or directory
/volumeUSB1/usbshare/directory $ mv te\ st test
mv: can't rename 'te': No such file or directory
mv: can't rename 'st': No such file or directory

type mvdevoluciones mv is /bin/mv. El filecomando no está disponible en mi máquina. cat /bin/mvReveló que es un pequeño guión que termina con una llamada /bin/busybox mv $@.

¿Dónde está mi error?

Respuesta1

Como agregó, el mvcomando es un script /bin/mvcon esta última línea:

/bin/busybox mv $@

A esta línea le faltan comillas alrededor de $@:

/bin/busybox mv "$@"

$@denota la lista de parámetros proporcionados al script. Citar esta variable tiene el significado especial de que, cuando se expanda, cada parámetro se citará por separado. Esto es válido al menos para bash, dashy también busybox.

De esta manera, el mvcomando también debería funcionar cuando un argumento contiene espacios en blanco entre comillas.

información relacionada