Я предполагаю, что каждая строка должна привести к новому рисунку. Так что-то как
synclient -m 100 |
while read _ x y; do
drawprogram $x $y
done
должен сделать. Если Вы добираетесь, проблемы буферизации затем взглянули на stdbuf
.
find есть несколько хитростей, чтобы справиться с этим случаем:
Если выражение не содержит никаких действий, кроме
-prune
,
Поэтому явно печатайте только те части, которые вам нужны:
find -type d \( -iname old -prune -o -iname backup -prune -o -iname .git -print \)
вообще избегает поиска в старых и резервных деревьях.
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
.
Вам понадобится опция -prune
для find
,
это действительно довольно сложно. Также требуется использовать -path
вместо -name
.
Думаю, вы захотите использовать это:
find . -type d \( -path '*/old' -prune -o -iname '.git' -print \)
Эффект -not
реализуется путем
-print
в конце командной строки, отключено, если -print
уже используется) Я понимаю, что другие варианты, хотя выглядят более сложными в командной строке, могут быть проще в использовании, например, потому что использование другого логическое выражение и изменение действия по умолчанию.
С другой стороны, варианты, включающие -prune
, легче обобщить для более сложных случаев, когда другой синтаксис будет затруднен для обработки только потому, что он становится слишком длинным для чтения.
Вы можете исключить каталоги, указав -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.