Próbuję zmienić nazwę niektórych plików na mojej stacji Synology Diskstation za pośrednictwem SSH. Dostępną powłoką jest wbudowana powłoka BusyBox:
BusyBox v1.16.1 (2013-04-16 20:13:10 CST) built-in shell (ash)
Polecenie move zawsze zwraca dwa błędy, gdy próbuję użyć znaku spacji w źródłowej lub docelowej nazwie pliku. Wydawanie znaków spacji lub cytowanie nazwy pliku wydaje się nie mieć żadnego efektu.
Przykład zmiany nazwy pliku ze spacją w miejscu docelowym:
/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
Zmiana nazwy pliku ze spacją w źródle daje podobne wyniki:
/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
zwraca mv is /bin/mv
. file
Polecenie nie jest dostępne na moim komputerze. cat /bin/mv
ujawnił, że jest to mały skrypt, który kończy się wywołaniem /bin/busybox mv $@
.
Gdzie jest mój błąd?
touch
polecenie działa, wygląda bardziej na problemmv
niż z powłoką. Podejrzewam, żemv
jest to (źle napisany) skrypt powłoki. Cotype mv
ci mówi Co zfile /path/to/mv
założeniemfile
jest dostępne?type mv
zwracamv is /bin/mv
.file
Polecenie nie jest dostępne na moim komputerze ..cat /bin/mv
wykazały, że jest to mały skrypt, który kończy się wywołaniem/bin/busybox mv $@
. Więc myślę, że implementacja BusyBoxmv
jest wadliwa?\
działa, więc może twoja wersja busyboksa nie działa poprawnie. aby zidentyfikować wadliwą funkcję, pojawiacp temp tm\ mp
się również błąd?mv
robi skrypt, ale z pewnością powinno być wywołanie busybox/bin/busybox mv "$@"
. Nie działa ze spacjami, ponieważ$@
nie jest cytowany. Czy testowałeś/bin/busybox mv test 'te st'
bezpośrednio?/bin/mv
skrypcie dodałem znaki cudzysłowu do wywołania BusyBox . Działa jak urok, dziękuję! (Nadal jestem całkiem nowy w sieci StackExchange. @Dubu Czy chciałbyś opublikować rozwiązanie jako odpowiedź, abym mógł oflagować go jako prawidłowe rozwiązanie?)Odpowiedzi:
Jak dodałeś,
mv
polecenie jest skryptem/bin/mv
z tym ostatnim wierszem:W tym wierszu brakuje cudzysłowów wokół
$@
:$@
oznacza listę parametrów podanych do skryptu. Przywołanie tej zmiennej ma specjalne znaczenie, że po rozwinięciu każdy parametr będzie cytowany osobno. To jest ważny przez co najmniejbash
,dash
a takżebusybox
.W ten sposób
mv
polecenie powinno również działać, gdy argument zawiera spacje w cudzysłowie.źródło
/bin/rm
ma ten sam problem (w ten sposób sam dostałem się do problemu „mv”. Ostatnia linia to/bin/busybox rm $@
/bin/busybox rm "$@"