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 findimplementacjom (w tym FreeBSD, findskąd pochodzi i GNU find), możesz użyć -deletezamiast -exec rm....
Powodem, dla którego pojawia się błąd, jest to, że nie ma polecenia pomiędzy theni elseniektó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ć. yashi zshnie mają tego ograniczenia ( if false; then else echo x; fia nawet if false; then else fidział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)). mkshi yashzdarzył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, lsofjeśli się lsofnie powiedzie.