Не используйте подстановку команд на выходе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
отказа.