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