Как я могу найти каждый файл и каталог, соответствующий шаблону, за исключением использования одного каталога find
?
Скажем, у меня есть следующая структура файла;
, Foo-исключения-я / foo.txt Foo-исключить меня-не / foo.txt бар/ foo.txt Foobar / bar.txt foofoo.txt
как бы получить следующий вывод, используя find
:
./bar/foo.txt ./bar/foobar ./bar/foobar/foofoo.txt ./foo-exclude-me-not ./foo-exclude-me-not/foo.txt
Я пытался использовать обе следующие команды:
находить . -name 'foo-exclude-me' -prune -o -name 'foo *' находить . имя 'foo *' \! -path './foo-exclude-me/*'
но оба они возвращают это:
./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt
Как я могу правильно исключить foo-exclude-me
каталог?
foo-exclude-me
вместо./foo-exclude-me
. Также попробуйте добавить-print
в конце команды.-print
иfoo-exclude-me
вместо./foo-exclude-me
.Ответы:
Если нет
-print
, неявное действие по умолчанию применяется к каждому совпадению, даже к сокращенным. Явное-print
применяется только при указанных условиях, которые находятся-name 'foo*'
только в другой ветви-name 'foo-exclude-me'
.Вообще говоря, используйте явное,
-print
когда вы делаете что-то более сложное, чем сочетание предикатов.Ваша вторая попытка с
! -path './foo-exclude-me/*'
не сработала, потому./foo-exclude-me
что не совпадает./foo-exclude-me/*
(без трейлинга/
). Добавление! -path ./foo-exclude-me
будет работать.источник
источник
-prune
это актуально.-prune
является одним из самых запутанных вариантовfind
, потому что он отключает-print
(который включен по умолчанию)