Чому пошук і виконання з кількома умовами не працює без дужок?


1

У мене є дві дуже схожі findкоманди, одна з яких працює. Оскільки це актуально, я мушу зазначити, що немає файлів із розширеннями .cчи .hppрозширеннями.

# That one works
find ~/src/ \( -type f -iname '*.cpp' -or -iname '*.h' -or -iname '*.c' -or -iname '*.hpp' \) -exec echo {} \;
# That one doesn't
find ~/src/ -type f -iname '*.cpp' -or -iname '*.h' -or -iname '*.c' -or -iname '*.hpp' -exec echo {} \;

Відповіді:


1

Ну, ані робота, як ви очікували. Давайте подивимось на той, який "не працює", і застосуємо дужки та логіку, які маються на увазі.

find ~/src \( -type f -a -iname '*.cpp' \) -or \( -iname '*.h' \) -or \( -iname '*.c' \) -or \( -iname '*.hpp' \) -exec echo {} \;

Жодна дія не застосовується до файлів, які закінчуються на cpp, або до об'єктів файлової системи, які закінчуються на h та c. Тільки об'єкти файлової системи, які закінчуються на hpp, перегукуються, оскільки -execзаперечує поведінку findдруку за замовчуванням . Ви можете додати -exec echo {} \;або -printв кінці кожної доданої дужки, але це нерозумно.

Давайте виправимо "той, що працює"

find ~/src -type f \( -iname '*.cpp' -or -iname '*.h' -or -iname '*.c' -or -iname '*.hpp' \) -exec echo {} \;

Це така поведінка знаходження десь задокументована?
assp1r1n3

@ assp1r1n3 Прочитайте посібник, зверніть увагу на -printпараметр та заголовок ОПЕРАТОРИ.
fd0

Все-таки це дуже незрозуміло.
assp1r1n3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.