Мне легче рассуждать о следующих решениях, чем о других предлагаемых решениях:
find build -not \( -path build/external -prune \) -name \*.js
# you can also exclude multiple paths
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js
Важное примечание: пути, которые вы вводите после -path
, должны точно соответствовать тому, что find
напечатает без исключения. Если это предложение сбивает вас с толку, просто используйте полные пути через команду whole , например: find <strong>/full/path/</strong> -not \( -path <strong>/full/path/exclude/this</strong> -prune \) ...
. См. Примечание [1], если вы хотите лучшего понимания.
Внутри \(
и \)
- это выражение, которое будет точно соответствовать build/external
(см. Важное примечание выше) и, в случае успеха, позволит избежать обхода чего-либо ниже, Затем это группируется как одно выражение с экранированными круглыми скобками и начинается с префикса -not
, что заставит find
пропускать все, что соответствует этому выражению.
Кто-то может спросить, не добавит ли -not
все остальные файлы, скрытые -prune
, и ответ будет отрицательным. -prune
работает так, что все, что, когда оно достигнуто, файлы в этом каталоге постоянно игнорируются.
Это происходит из реального случая использования, когда мне нужно было вызвать yui-compress для некоторых файлов, сгенерированных wintersmith, но пропустить другие файлы, которые нужно отправить как есть.
Примечание [1] : Если вы хотите исключить /tmp/foo/bar
, и вы запускаете поиск как этот "find /tmp \(...
", то вы должны указать -path /tmp/foo/bar
. Если, с другой стороны, вы запускаете find как этот cd /tmp; find . \(...
, то вы должны указать -path ./foo/bar
.