Nie używaj podstawiania poleceń na wyjściufind
. Tutaj wszystko można zrobić za pomocą find
:
find . -mtime 1 -type f ! -exec lsof -t {} \; -exec rm -f {} \; > /dev/null
Dzięki kilku find
implementacjom (w tym FreeBSD, find
skąd pochodzi i GNU find
), możesz użyć -delete
zamiast -exec rm...
.
Powodem, dla którego pojawia się błąd, jest to, że nie ma polecenia pomiędzy then
i else
niektóre powłoki (zaczynając od powłoki Bourne'a, z której pochodzi ta składnia) wymagają co najmniej jednej (a komentarz nie jest poleceniem). Zauważ, że jest to całkowicie arbitralne i nie ma powodu, dla którego te powłoki miałyby to robić. yash
i zsh
nie mają tego ograniczenia ( if false; then else echo x; fi
a nawet if false; then else fi
działają z nimi dobrze).
Jak powiedzieli inni, możesz użyć polecenia noop, takiego jak :
(lub for nothing in; do nothing; done
), lub odwrócić logikę za pomocą !
słowa kluczowego (dostępne w powłokach POSIX, ale nie w powłoce Bourne'a (przekonasz się, że używanie :
tego było powszechne w tej powłoce)). mksh
i yash
zdarzyło się wspierać if false; then () else echo x; fi
(nie polegałbym na tym, ponieważ mogłoby to się zmienić w przyszłych wersjach).
Inne podejście polega na:
lsof... || {
cmd1
cmd2
}
choć jedną różnicą jest ogólny status wyjścia, który będzie, lsof
jeśli się lsof
nie powiedzie.
-exec
jest często przydatny,xargs
czasem jest potrzebna pętla powłoki. W takim przypadkuwhile read name
pętla jest preferowaną opcją (w bash z GNU find możesz użyć opcji -0 dla obu; przenośnie musisz zrezygnować z nowej linii).-print0
jest-exec printf '%s\0' {} +
(ale przenośnie nie możesz sobie poradzić z tymi danymi wyjściowymi, chyba że chcesz wziąć pod uwagęperl
), a za pomocąfind .//.
i przetwarzania końcowego możesz uciec od nowych linii dlaxargs
. Zauważ, że to niewhile read
jestwhile IFS= read -r
.Wygląda na to, że chcesz zrobić brak operacji, jeśli plik jest otwarty, więc powinieneś dodać polecenie
:
, które jest zerowym poleceniem wbash
:Jeśli nie używasz
:
,bash
nie możesz przeanalizować kodu i wyświetli się błądbash: syntax error near unexpected token 'else'
.źródło
:
i jest to pierwsze polecenie wymienione w wbudowanych pakietach bash.Inna alternatywa: odwróć swoją logikę.
źródło
TL; DR
Żadna z pozostałych odpowiedzi nie odpowiada na pierwotne pytanie, dlaczego polecenie powoduje błąd składniowy. Jest to spowodowane brakiem polecenia między tym a innym .
Brakujące polecenie
Twój oryginalny kod wygląda następująco:
Problem polega na tym, że trzeba komentarza między wtedy a inny , ale uwaga nie jest traktowany jako polecenia. Krótko mówiąc, możesz przepisać problem (strukturalnie) w następujący sposób:
Napraw swoją składnię za pomocą wbudowanego Bourne'a
Można rozwiązać ten problem poprzez umieszczenie rzeczywiste polecenia przed indziej , ale komentarz sama nie zrobi. Sekcja jeśli-to nie może być pusta; jeśli chcesz symbol zastępczy, możesz użyć wbudowanego dwukropka . Na przykład:
Po prostu umieszczenie
:
w sekcji pomiędzy tym a innym razem naprawi występujący błąd składni.źródło
$ ; -bash: syntax error near unexpected token ';'