Почему я не могу исключить 2 или более шаблонов из команды find в Linux?

Почему я не могу исключить 2 или более шаблонов из команды find в Linux?

Я пытаюсь исключить .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'. Это гораздо легче читать.

Связанный контент