Не используйте подстановку команд на выходеfind . Здесь все можно сделать с помощью find:
find . -mtime 1 -type f ! -exec lsof -t {} \; -exec rm -f {} \; > /dev/null
С несколькими findреализациями (включая FreeBSD, findоткуда она взята и GNU find), вы можете использовать -deleteвместо -exec rm....
Причина, по которой вы получаете ошибку, заключается в том, что между thenи elseи некоторыми оболочками нет команды (начиная с оболочки Bourne, из которой исходит этот синтаксис), требуется по крайней мере одна (и комментарий не является командой). Обратите внимание, что это совершенно произвольно, и нет никаких причин, почему эти оболочки делают это. yashи zshне имеют этого ограничения ( if false; then else echo x; fiи даже if false; then else fiотлично работают с ними).
Как уже говорили другие, вы можете использовать команду noop, например :(или for nothing in; do nothing; done), или изменить логику с помощью !ключевого слова (доступно в оболочках POSIX, но не в оболочке Bourne (вы обнаружите, что использование :для этого было распространено в этой оболочке)). mkshи yashслучиться с поддержкой if false; then () else echo x; fi(я бы не стал полагаться на это, поскольку это может измениться в будущих версиях).
Другой подход с:
lsof... || {
cmd1
cmd2
}
хотя одно из различий заключается в общем состоянии выхода, которое будет в lsofслучае lsofотказа.