Следующий пример в Linux найти страницу man не работает:

   find repo/ -exec test -d {}/.svn \; -or \
   -exec test -d {}/.git \; -or -exec test -d {}/CVS \; \
   -print -prune

   Given the following directory of projects and their associated SCM
   administrative directories, perform an efficient search for the
   projects' roots:

   repo/project1/CVS
   repo/gnu/project2/.svn
   repo/gnu/project3/.svn
   repo/gnu/project3/src/.svn
   repo/project4/.git

   In this example, -prune prevents unnecessary descent into directories
   that have already been discovered (for example we do not search
   project3/src because we already found project3/.svn), but ensures
   sibling directories (project2 and project3) are found.

Поиск не показывает вывод. Кто-нибудь знает почему? Я заметил, что в этой находке нет тестов, поскольку условие "-exec" - это действия, а не тесты (может ли действие быть тоже тестом?). и так как «-or» имеет более низкий приоритет, чем подразумеваемый «-and» между последними «-exec» и «-print», логика, выраженная в командной строке, кажется не такой, как предполагалось.

>uname -r
 2.6.32-131.0.15.el6.x86_64
>pwd
 /var/tmp
>mkdir -p repo/project1
>mkdir -p repo/gnu/project2
>mkdir -p repo/gnu/project3/src
>mkdir -p repo/project4
>touch repo/project1/CVS
>touch repo/gnu/project2/.svn
>touch repo/gnu/project3/.svn
>touch repo/gnu/project3/src/.svn
>touch repo/project4/.git

>find repo
repo
repo/project4
repo/project4/.git
repo/gnu
repo/gnu/project3
repo/gnu/project3/src
repo/gnu/project3/src/.svn
repo/gnu/project3/.svn
repo/gnu/project2
repo/gnu/project2/.svn
repo/project1
repo/project1/CVS

>find repo/ -exec test -d {}/.svn \; -or -exec test -d {}/.git \; -or -exec test -d {}/CVS \; -print -prune
>

2 ответа2

0

Пример плохой. Это делает

find -exec command1 \; -or -exec command2 \; -or -exec command3 \; -print -prune

Что эквивалентно

find -exec command1 \; -or -exec command2 \; -or -exec command3 \; -and -print -and -prune

Но так как -and (-a) имеет более высокий приоритет, чем -or (-o), -print и -prune применяются только к -command3

Сообщение об ошибке

О test . Вы путаете tests в справочной странице поиска, которая называется просто определенной группой их операторов, с командой test, которая использовалась выше.

0

То, что мужчина пишет о exec в первом предложении, должно ответить на ваш вопрос:

   -exec command ;
          Execute command; **true if 0 status** is returned.

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