SSH 経由で Synology Diskstation 上のいくつかのファイルの名前を変更しようとしています。使用可能なシェルは BusyBox 組み込みシェルです。
BusyBox v1.16.1 (2013-04-16 20:13:10 CST) built-in shell (ash)
移動元または移動先のファイル名にスペース文字を使用すると、移動コマンドで常に 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 mv
を返しますmv is /bin/mv
。このfile
コマンドは私のマシンでは使用できません。cat /bin/mv
これは、 を呼び出して終了する小さなスクリプトであることが明らかになりました/bin/busybox mv $@
。
私の間違いはどこですか?
答え1
追加したとおり、コマンドは最後の行を含むmv
スクリプトです。/bin/mv
/bin/busybox mv $@
この行には引用符がありません$@
:
/bin/busybox mv "$@"
$@
スクリプトに与えられたパラメータのリストを表します。この変数を引用符で囲むと、展開時に各パラメータが個別に引用符で囲まれるという特別な意味を持ちます。これは少なくともbash
、dash
および に対して有効ですbusybox
。
この方法では、mv
引数に引用符で囲まれた空白が含まれている場合でもコマンドが機能するはずです。