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