Renomeie arquivos com espaços em um shell BusyBox

5

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

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

O comando move sempre produz dois erros quando tento usar um caractere de espaço no nome de arquivo de origem ou de destino. Escapando caracteres de espaço ou citando 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 fonte 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 mv retorna mv is /bin/mv . O comando file não está disponível na minha máquina. cat /bin/mv revelou que é um script pequeno que termina com a chamada de /bin/busybox mv $@ .

Onde está o meu erro?

    
por Karl 17.06.2014 / 12:55

1 resposta

3

Como você adicionou, o comando mv é um script em /bin/mv com esta última linha:

/bin/busybox mv $@

Esta linha está sem aspas em torno de $@ :

/bin/busybox mv "$@"

$@ indica a lista de parâmetros fornecidos ao script. Citando esta variável tem o significado especial que, quando expandido, cada parâmetro será citado separadamente. Isso é válido por pelo menos bash , dash e também busybox .

Dessa forma, o comando mv também deve funcionar quando um argumento contiver espaços em branco citados.

    
por 17.06.2014 / 20:58