Obecnie piszę skrypt startowy dla serwera gry Minecraft. W tym skrypcie załączyłem skrypt zapasowy.
Ten skrypt kopii zapasowej działa prawie idealnie, ale zamiast usuwać zawartość folderów, tworzy tylko kolejny (podobnie nazwany) i nie robi nic z docelowym folderem.
Używam tego polecenia: rm -rf "$MINECRAFT_PATH/server.log backups/*"
To polecenie jest wykonywane w skrypcie bash.
Zmienna $MINECRAFT_PATH
zawiera poprawną ścieżkę. Utworzony folder ma następującą nazwę: server.log.backups
(Zwróć uwagę na kropkę pomiędzy log
i backups
). Ale ukierunkowane folder ma tę nazwę: server.log backups
. Ten folder istnieje i nie stanowi to problemu.
rm
nie można utworzyć katalogu. Podwójne cudzysłowy zapobiegają ekspansji symboli wieloznacznych.Odpowiedzi:
Podwójne cudzysłowy w Bash zachowują większość dosłownych wartości treści, więc
*
glob jest przekazywany dosłownie dorm
, który spróbuje usunąć plik lub folder o nazwie*
.$MINECRAFT_PATH
Podstawiony chociaż.Prawdopodobnie chcesz:
Spowoduje to usunięcie zawartości
server.log backups
folderu.Niektóre alternatywy:
Możesz zaprogramować skrypt bardziej defensywnie, usuwając w ten sposób
-f
opcjęrm
. W takim przypadku nie powiedzie się, jeśliserver.log backups
folder będzie pusty, ponieważ glob nie zostanie rozwinięty i przekazany dosłownie, a plik nie zostanie wywołanyserver.log backups/*
.Możesz po prostu
rm -rf
cały folder imkdir -p
później.Lub możesz po prostu zrobić głębokie usunięcie wszystkich plików i folderów w
server.log backups
folderze.-mindepth 1
zapobiega usunięciu rodzica:źródło
*
należy przekazać go bezpośrednio do polecenia:mkdir foo; echo foo/*
zwracafoo/*
. Więcrm foo/*
powinien spróbować usunąć plik*
wewnątrzfoo
, co nie istnieje, ale nie zwraca błędu ani powodu-f
. Ale folderfoo/
nie powinien zostać usunięty. (Przynajmniej domyślniebash 4
na moim debianie, czy jest inaczej w OSX?)-f
opcjirm
sprawdzania, czy coś pójdzie nie tak.*
. Teraz działa. Dziękujemy również za rozszerzoną odpowiedź!