Renomeie arquivos com espaços em um shell BusyBox

Renomeie arquivos com espaços em um shell BusyBox

Estou tentando renomear alguns arquivos em meu Synology Diskstation via SSH. O shell disponível é o shell integrado do BusyBox:

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

O comando mover sempre gera dois erros quando tento usar um caractere de espaço no nome do arquivo de origem ou de destino. Escapar caracteres de espaço ou citar o nome do arquivo parece não ter efeito.

Exemplo para renomear um arquivo com um caractere de espaço no 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

Renomear um arquivo com um caractere de espaço na origem produz resultados semelhantes:

/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 mvretorna mv is /bin/mv. O filecomando não está disponível na minha máquina. cat /bin/mvrevelou que é um pequeno script que termina com call /bin/busybox mv $@.

Onde está o meu erro?

Responder1

Conforme você adicionou, o mvcomando é um script /bin/mvcom esta última linha:

/bin/busybox mv $@

Esta linha está faltando aspas $@:

/bin/busybox mv "$@"

$@denota a lista de parâmetros fornecidos ao script. A citação desta variável tem o significado especial de que, quando expandida, cada parâmetro será citado separadamente. Isso é válido para pelo menos bashe dashtambém busybox.

Dessa forma, o mvcomando também deve funcionar quando um argumento contém espaços em branco entre aspas.

informação relacionada