Существуют ли идиоматические средства для обнаружения, найдены ли "найти" какие-либо совпадения? Я сейчас пользуюсь
COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then
но это кажется немного косвенным для меня. Кроме того, я хотел бы найти, чтобы остановить поиск, как только он найдет совпадение, чтобы не тратить время и силы. Мне просто нужно знать, есть ли какие-либо файлы, которые соответствуют.
Обновление: я сделал ошибку, написав свой вопрос без кода передо мной: я использую wc -l
другой случай, когда мне все равно нужно знать общее количество найденных файлов. В случае, когда я только проверяю, есть ли совпадения, я использовал if [ -z $(find …) ]
.
-n
применяется только к «определенным» переменным ($ abc, $ xyz и т. Д.), Но я предполагаю, что $ (...) - это «определенная» временная переменная .. +1 ... (и я просто недавно прочитал, что использование-n
рискованно, если только вы не уверены, что переменная еще не объявлена и не используется) ... но у temp такой возможности не будет ... т.е. неинициализированный против пустого-n
проверяет, является ли строка пустой, она не имеет ничего общего с переменными. То, что вы читали, вероятно, говорило, что использование-n
не проверяет, определена ли переменная:-n "$foo"
ложно, еслиfoo
определено, но пусто, и отображает сообщение об ошибке вset -u
.[ -n "${foo+1}" ]
надежно проверяет,foo
установлен ли он, но обычно одинаково обрабатывает пустые и неустановленные переменные:[ -n "${foo:+1}" ]
или просто,[ -n "$foo" ]
если вас это не беспокоитset -u
.-quit
наличии, но трубопроводhead -n 1
работает (как и делаетhead -c 1
, который останавливается еще раньше, но, вероятно, с незначительной выгодой). Также я сделал ошибку, написав свой вопрос без кода передо мной: я используюwc -l
другой случай, когда мне нужно знать общее количество найденных файлов. В случае, когда я только проверяю, есть ли совпадения, я использовалif [ -z `find … ` ]
.Вы можете использовать
-quit
действие, чтобы остановить после первого матча. Возможно, вы захотите объединить это с другим действием (например-print
), или вы не сможете определить, нашел ли он что-нибудь.Например,
find ... -print -quit
напечатает путь к первому подходящему файлу и затем выйдет. Или вы можете использовать-printf 1 -quit
для печати 1, если есть совпадение и ничего, если нет.find
Статус выхода отражает наличие ошибок при поиске, а не обнаружил ли он что-либо, поэтому вы должны проверить его выходные данные, чтобы убедиться, что они совпадают.источник
-quit
является расширением GNU. Он не будет работать в системах, использующих другие реализации find (1), такие как OS X, BSD и, возможно, большинство коммерческих Unices.Выход 0 легко найти, выход> 0 сложнее, потому что обычно это происходит только с ошибкой. Однако мы можем сделать это:
Обратите внимание, что это решение более производительно, чем использование подоболочки; execing false, безусловно, быстрее, чем exe даже Dash:
источник
Вы можете обернуть его в состояние оболочки, например:
Где
...
ваше условие соответствия, например-name *.txt
.Некоторые другие примеры:
источник