Я хочу, чтобы мой bash печатал 'found', только если что-то найдено, используя команду find. Но использование && не помогает: даже если ничего не найдено, я печатаю «найдено». Пример:
$ pwd
/data/data/com.termux/files/home/test/test1/test4
$ ls
xaa xab
$ find . -name xac && echo 'found'
found
$ find . -name xaa && echo 'found'
./xaa
found
command-line
find
Йозеф Климук
источник
источник
/some/path
говорит найти, где начать искать, но ничего не говорит ему, что искать. То же самое в вашем связанном ответе. Что работает для меня этоfind /some/path -name xac -print0 -quit | grep -qz . && echo found
. Я что-то пропустил?-print0 -quit
. То, что вы положили до этого, зависит от того, что вы хотите найти. Я решил опустить это здесь.Ответ Муру подходит и подходит для случаев, когда мы хотим напечатать что-нибудь, если файл найден. Для общего случая, когда мы хотим выполнить внешнюю команду, например
echo
, мы могли бы использовать-exec
флаг.{}
Часть проходит имя файла в команде между-exec
и в\;
качестве аргументов. Обратите внимание на то, что\
раньше;
- это предотвращает неверное толкование оболочкой ; при закрытии оболочки точка с запятой означает конец команды, но при экранировании с косой чертой оболочка будет воспринимать его как обычный текст, который будет переданfind
команде, а для поиска команды она служит-exec
аргументом флага закрытия .Для построения условных
if found do this; else do that
выражений мы могли бы использовать команду substitution$()
иtest
command (aka[
):Обращаясь к комментарию Дэна
Дан в комментариях спросил:
Давайте сначала поймем проблему. Обычно в оболочках есть понятие разделения слов, что означает, что переменные без кавычек и позиционные параметры будут расширяться и рассматриваться как отдельные элементы. Например, если у вас есть переменная
var
и содержитhello world
текст, когда вы делаетеtouch $var
оболочка будет разбить его на два отдельных пунктовhello
иworld
иtouch
будет понятно , что , как если бы вы пытались создать 2 отдельные файлы; если вы это сделаетеtouch "$var"
, то оболочка будет обрабатыватьсяhello world
как одна единица иtouch
будет создавать только один файл. Это важно понимать, что это происходит только из-за того, как работают оболочки.В отличие от этого,
find
не страдает от такого поведения, потому что команды обрабатываютсяfind
сами по себе и выполняютсяexecvp()
системным вызовом, поэтому оболочка не участвует. Хотя фигурные скобки имеют особое значение в оболочках, поскольку они появляются в серединеfind
команды, а не в начале, в этом случае они не несут особого значения для оболочки. Вот пример. Давайте создадим несколько сложных имен файлов и попробуем передать их в качестве аргументаstat
команде.Как вы можете видеть,
stat
получает сложные имена файлов безупречноfind
, что является одной из основных причин, почему это рекомендуется для использования в переносимых скриптах, и особенно полезно, когда вы просматриваете дерево каталогов и хотите что-то сделать с именами файлов, которые потенциально могут иметь специальные символы в них. Следовательно, нет необходимости заключать фигурные скобки в команды, выполняемые вfind
.Это другая история, когда включается оболочка. Иногда вам нужно использовать оболочку для обработки имени файла. В этом случае цитирование действительно имеет значение, но важно понимать, что проблема не в поиске, а в разделении слов.
Поэтому, когда мы цитируем в оболочке , это будет работать. Но опять же, это важно для оболочки, а не
find
.источник
echo "I found {}"
бы лучше, чемecho "I found " {}
? Может быть, для echo это нормально, но если кто-то скопирует команду и заменит echo другой командой, у него может быть проблема.