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.