web-dev-qa-db-ja.com

BusyBoxシェルでスペースを使用してファイルの名前を変更する

SynologyDiskstation上のいくつかのファイルの名前をSSH経由で変更しようとしています。利用可能なシェルは、BusyBoxの組み込みシェルです。

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

ソースファイル名または宛先ファイル名のいずれかでスペース文字を使用しようとすると、moveコマンドで常に2つのエラーが発生します。スペース文字をエスケープしたり、ファイル名を引用したりしても効果がないようです。

宛先にスペース文字を含むファイルの名前を変更する例:

/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

ソースでスペース文字を使用してファイルの名前を変更すると、同様の結果が得られます。

/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 mvmv is /bin/mvを返します。 fileコマンドは私のマシンでは使用できません。 cat /bin/mvは、それが/bin/busybox mv $@の呼び出しで終わる小さなスクリプトであることを明らかにしました。

私の間違いはどこにありますか?

5
Karl

追加したように、mvコマンドは/bin/mvのスクリプトであり、最後の行は次のとおりです。

/bin/busybox mv $@

この行には、$@の前後に引用符がありません。

/bin/busybox mv "$@"

$@は、スクリプトに指定されたパラメーターのリストを示します。この変数を引用することは、展開されると、すべてのパラメーターが別々に引用されるという特別な意味を持っています。これは、少なくともbashdash、およびbusyboxに対して有効です。

このように、mvコマンドは、引数に引用符で囲まれた空白が含まれている場合にも機能するはずです。

3
Dubu