Почему "найти" обрезку не так, как я думаю?

Я использую MacOSX 10.5.8

Я запускаю следующее:

~/Sites/jjprof/trunk/content > find . -type d -name '*svn' -prune
./.svn
./resources/.svn
./resources/sitewide/.svn
./temporary/.svn
./users/.svn
./users/avatars/.svn

Я ожидаю, что эта команда будет игнорировать все подкаталоги.svn; вместо этого он отображает их.

find . -name '*svn' -prune 

делает то же самое.

2 ответа

Решение

Попробуй это:

find -type d -path '.svn' -prune -o -print

От man find в разделе -name:

Чтобы игнорировать каталог и файлы в нем, используйте -prune; см. пример в описании
-path,

В разделе о -path:

Чтобы игнорировать все дерево каталогов, используйте -prune вместо проверки каждого файла в дереве. Например, чтобы пропустить каталог src/emacs и все файлы и каталоги под ним, и напечатать имена других найденных файлов, сделайте что-то вроде этого:

             find . -path ./src/emacs -prune -o -print

Из раздела "Примеры":

Тем не менее -prune само действие возвращает истину, поэтому следующее -o гарантирует, что правая часть будет оценена только для тех каталогов, которые не были удалены (содержимое сокращенных каталогов даже не посещается, поэтому их содержимое не имеет значения).

найти ручные состояния, что чернослив "игнорирует предыдущий путь...", поэтому команда должна быть

find . -prune -type d -name '*svn'

Это потому, что вы можете иметь что-то вроде

find -path . -name '*svn' -o -path './notimportantdir' -prune

который находит '*svn' в текущем пути, кроме тех, которые находятся в notimportantdir

Другие вопросы по тегам