Найдите “.git” директоров, но проигнорируйте некоторые пути; или как 'находит - не', работают

Я предполагаю, что каждая строка должна привести к новому рисунку. Так что-то как

synclient -m 100 |
  while read _ x y; do
    drawprogram $x $y
  done

должен сделать. Если Вы добираетесь, проблемы буферизации затем взглянули на stdbuf.

4
22.09.2016, 04:17
4 ответа
В

find есть несколько хитростей, чтобы справиться с этим случаем:

Если выражение не содержит никаких действий, кроме -prune , -print выполняется для всех файлов для что выражение истинно.

Поэтому явно печатайте только те части, которые вам нужны:

find -type d \( -iname old -prune -o -iname backup -prune -o -iname .git -print \)

вообще избегает поиска в старых и резервных деревьях.

2
27.01.2020, 20:51
 find -type d -iname .git -not -iname old 
 

Соответствует каталогам, которые называются .git и не называются old . Поскольку каталог с именем .git не может быть назван старым , часть -not -iname old может быть удалена без изменения значения команды.

-not говорит «не совпадает», но не «не повторять в». Есть другой способ сказать «не возвращаться»: это действие под названием -prune . Следующая команда означает «рекурсивный обход всех каталогов ( find ), но остановка в каталогах с именем old ( -iname old -prune ) и печать каталогов с именем .git ”:

find -iname old -prune -o -type d -iname .git -print

Это разбирается как (-iname old -prune) -o (-type d -iname .git -print) . Find получает указание искать файлы, которые удовлетворяют условиям -iname old или ( -o ) -type d -iname .git . Когда файл удовлетворяет первому условию, выполняется действие -prune (вырезать из пройденного дерева, т.е. не выполнять рекурсию). Когда файл соответствует второму условию, выполняется действие -print . Поскольку печать является действием по умолчанию, вы можете опустить -print .

1
27.01.2020, 20:51

Вам понадобится опция -prune для find , это действительно довольно сложно. Также требуется использовать -path вместо -name .

Думаю, вы захотите использовать это:

find . -type d \( -path '*/old' -prune -o -iname '.git' -print \)

Эффект -not реализуется путем

  • сопоставления старого «старого» и ничего не дониг
  • или (с помощью опции - п)
  • сопоставление ".git "и выводит имя
  • или (по умолчанию)
  • , ничего не делая (потому что обычное действие по умолчанию find, неявное -print в конце командной строки, отключено, если -print уже используется)

Я понимаю, что другие варианты, хотя выглядят более сложными в командной строке, могут быть проще в использовании, например, потому что использование другого логическое выражение и изменение действия по умолчанию.
С другой стороны, варианты, включающие -prune , легче обобщить для более сложных случаев, когда другой синтаксис будет затруднен для обработки только потому, что он становится слишком длинным для чтения.

2
27.01.2020, 20:51

Вы можете исключить каталоги, указав -path :

find . -type d \( -iname .git ! -path "*/old/*" ! -path "*/backup/*" \)

Обратите внимание, что -not в GNU find совпадает с ! , но не совместим с POSIX.

Цитата из man find :

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.

   -not expr
          Same as ! expr, but not POSIX compliant.
2
27.01.2020, 20:51

Теги

Похожие вопросы