Я пытаюсь исключить .svg
и .jpg
файлы из моей команды find, однако она все равно возвращает их оба. Что я делаю не так?
find . \( ! -iname \*\.svg -o ! -iname \*\.jpg \)
решение1
Ваша логика ошибочна: с помощью команды, которая у вас есть сейчас, вы найдете каждый не- .svg
или каждый не- .jpg
файл. То, что вы написали, читается как:
найти (все, что не является SVGиливсе, что не JPG)
Итак, вы получите файлы JPG, потому что find
уже оценили первую часть и дали вам все, что не является файлом SVG. Из-за способа разбора опций, если первая часть выражения or
оценивается как истина, вторая часть даже не рассматривается.
По сути, как только find
он возвращает вам все, что не является SVG, ему все равно, что вы хотите от файлов JPG.
Правильным способом выражения этого было бы использовать логическую фразу and
:
find . \( ! -iname '*.svg' -a ! -iname '*.jpg' \)
Это звучит так:
найти (все, что не является SVGивсе, что не JPG)
Или, отрицая все выражение:
find . ! \(-iname '*.svg' -o -iname '*.jpg' \)
Что звучит так:
найти все, что не (SVGилиJPG)
Обратите внимание, что вы можете пропустить экранирование, *
если просто поместите его в одинарные или двойные кавычки, например -iname '*.jpg'
. Это гораздо легче читать.