Не используйте подстановку команд на выходе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
отказа.
-exec
часто это полезно,xargs
иногда требуется цикл оболочки. В этом случаеwhile read name
предпочтительным вариантом является цикл (в bash с GNU find вы можете использовать опцию -0 для обоих; порой вам придется отказаться от перевода строки).-print0
есть-exec printf '%s\0' {} +
(но, к сожалению, вы не можете иметь дело с этим выводом, кроме случаев, когда вы хотите рассмотреть этоperl
), и с помощьюfind .//.
некоторой постобработки вы можете избежать перехода на новую строкуxargs
. Обратите внимание, что это неwhile read
такwhile IFS= read -r
.Кажется, что вы хотите сделать no-op, если файл открыт, поэтому вы должны добавить a
:
, которая является пустой командойbash
:Если вы не используете
:
,bash
не можете проанализировать ваш код, и будет отображаться ошибка, какbash: syntax error near unexpected token 'else'
.источник
:
и это первая команда, перечисленная в bash-buildins.Другой вариант: поменять логику.
источник
TL; DR
Ни один из других ответов на самом деле не отвечает на ваш первоначальный вопрос о том, почему команда выдает синтаксическую ошибку. Это вызвано отсутствием команды между then и else .
Пропавшая команда
Ваш оригинальный код выглядит так:
Проблема заключается в том, что у вас есть комментарий между тогда и еще , но комментарий не рассматривается как команда. Короче говоря, вы можете переписать проблему (структурно говоря) следующим образом:
Исправьте свой синтаксис с помощью Bourne Builtin
Вы можете решить эту проблему путем размещения фактических команд , прежде чем еще , но комментарий самого по себе не будет делать. Раздел if-then не может быть пустым; если вы хотите заполнитель, вы можете использовать встроенное двоеточие . Например:
Просто размещение
:
в секцию между затем и еще будет исправить ошибку синтаксиса вы испытываете.источник
$ ; -bash: syntax error near unexpected token ';'