Переименовывать файлы с пробелами в оболочке BusyBox

Переименовывать файлы с пробелами в оболочке BusyBox

Я пытаюсь переименовать некоторые файлы на Synology Diskstation через SSH. Доступная оболочка — встроенная оболочка BusyBox:

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

Команда move всегда выдает две ошибки, когда я пытаюсь использовать пробел в имени исходного или конечного файла. Экранирование пробелов или заключение имени файла в кавычки, похоже, не дает никакого эффекта.

Пример переименования файла с пробелом в месте назначения:

/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команда должна работать и в том случае, если аргумент содержит пробелы в кавычках.

Связанный контент