Zmień nazwę plików ze spacjami w powłoce BusyBox


5

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 mvzwraca mv is /bin/mv. filePolecenie nie jest dostępne na moim komputerze. cat /bin/mvujawnił, że jest to mały skrypt, który kończy się wywołaniem /bin/busybox mv $@.

Gdzie jest mój błąd?


4
Ponieważ touchpolecenie działa, wygląda bardziej na problem mvniż z powłoką. Podejrzewam, że mvjest to (źle napisany) skrypt powłoki. Co type mvci mówi Co z file /path/to/mvzałożeniem filejest dostępne?
Stéphane Chazelas,

type mvzwraca mv is /bin/mv. filePolecenie nie jest dostępne na moim komputerze .. cat /bin/mvwykazały, że jest to mały skrypt, który kończy się wywołaniem /bin/busybox mv $@. Więc myślę, że implementacja BusyBox mvjest wadliwa?
Karl

Osobiście testuję na busyboksie 1.21.1 zawartym w Ubuntu 14.04 i mv używany plik \ działa, więc może twoja wersja busyboksa nie działa poprawnie. aby zidentyfikować wadliwą funkcję, pojawia cp temp tm\ mpsię również błąd?
Kiwy

3
@Karl Nie wiem, co mvrobi 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?
Dubu,

Oczywiście! W /bin/mvskrypcie 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?)
Karl

Odpowiedzi:


3

Jak dodałeś, mvpolecenie jest skryptem /bin/mvz tym ostatnim wierszem:

/bin/busybox mv $@

W tym wierszu brakuje cudzysłowów wokół $@:

/bin/busybox mv "$@"

$@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 najmniej bash, dasha także busybox.

W ten sposób mvpolecenie powinno również działać, gdy argument zawiera spacje w cudzysłowie.


1
Należy również pamiętać, że /bin/rmma ten sam problem (w ten sposób sam dostałem się do problemu „mv”. Ostatnia linia to /bin/busybox rm $@/bin/busybox rm "$@"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.