1

Я пытаюсь исключить файлы .svg и .jpg из моей команды find, однако она все равно возвращает их оба. Что я делаю неправильно?

find . \( ! -iname \*\.svg -o ! -iname \*\.jpg \)

1 ответ1

2

Ваша логика ошибочна: с помощью команды, которая у вас есть прямо сейчас, вы найдете каждый файл не .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' . Это намного легче читать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .