Как исключить каталог в find.команда - PullRequest
1149 голосов
/ 18 ноября 2010

Я пытаюсь запустить команду find для всех файлов JavaScript, но как исключить конкретный каталог?

Вот код find, который мы используем.

for file in $(find . -name '*.js')
do 
  java -jar config/yuicompressor-2.4.2.jar --type js $file -o $file
done

Ответы [ 33 ]

10 голосов
/ 30 августа 2017

Подход -path -prune также работает с подстановочными знаками в пути. Вот оператор find, который найдет каталоги для сервера git, обслуживающего несколько репозиториев git, оставив внутренние каталоги git:

find . -type d \
   -not \( -path */objects -prune \) \
   -not \( -path */branches -prune \) \
   -not \( -path */refs -prune \) \
   -not \( -path */logs -prune \) \
   -not \( -path */.git -prune \) \
   -not \( -path */info -prune \) \
   -not \( -path */hooks -prune \)  
8 голосов
/ 19 марта 2014

Чтобы исключить несколько каталогов:

find . -name '*.js' -not \( -path "./dir1" -o -path "./dir2/*" \)

Чтобы добавить каталоги, добавьте -o -path "./dirname/*":

find . -name '*.js' -not \( -path "./dir1" -o -path "./dir2/*" -o -path "./dir3/*"\)

Но, возможно, вам следует использовать регулярное выражение ,если нужно исключить много каталогов.

8 голосов
/ 07 марта 2018

Есть много хороших ответов, мне потребовалось некоторое время, чтобы понять, для чего предназначен каждый элемент команды, и какая логика стоит за ней.

find . -path ./misc -prune -o -name '*.txt' -print

find начнет поиск файлов и каталогов втекущий каталог, следовательно, find ..

Параметр -o обозначает логическое ИЛИ и разделяет две части команды:

[ -path ./misc -prune ] OR [ -name '*.txt' -print ]

Любой каталог или файл, not каталог ./misc не пройдет первый тест -path ./misc.Но они будут проверены против второго выражения.Если их имя соответствует шаблону *.txt, которое они напечатали, из-за опции -print.

Когда find достигает каталога ./misc, этот каталог удовлетворяет только первому выражению.Таким образом, опция -prune будет применена к нему.Он сообщает команде find, что не исследует этот каталог.Таким образом, любой файл или каталог в ./misc даже не будет проверен командой find, не будет проверен на соответствие второй части выражения и не будет напечатан.

7 голосов
/ 09 декабря 2013

Для рабочего решения (проверено на Ubuntu 12.04 (Precise Pangolin)) ...

find ! -path "dir1" -iname "*.mp3"

будет искать файлы MP3 в текущей папке и подпапках, кроме подпапки dir1.

Используйте:

find ! -path "dir1" ! -path "dir2" -iname "*.mp3"

... чтобы исключить dir1 И dir2

6 голосов
/ 21 июля 2015

Вы можете использовать опцию чернослива для достижения этой цели. Как например:

find ./ -path ./beta/* -prune -o -iname example.com -print

Или обратная опция grep «grep -v»:

find -iname example.com | grep -v beta

Подробные инструкции и примеры можно найти в Команда поиска Linux исключает каталоги из поиска .

4 голосов
/ 30 августа 2014
find -name '*.js' -not -path './node_modules/*' -not -path './vendor/*'

, кажется, работает так же, как

find -name '*.js' -not \( -path './node_modules/*' -o -path './vendor/*' \)

и ИМО легче запомнить.

3 голосов
/ 16 ноября 2017

Для тех из вас, кто работает в более старых версиях UNIX и не может использовать -path или -не

Протестировано на SunOS 5.10 bash 3.2 и SunOS 5.11 bash 4.4

find . -type f -name "*" -o -type d -name "*excluded_directory*" -prune -type f
3 голосов
/ 30 мая 2013

Я использовал find, чтобы предоставить список файлов для xgettext, и хотел опустить конкретный каталог и его содержимое.Я перепробовал множество комбинаций -path в сочетании с -prune, но не смог полностью исключить каталог, который я хотел удалить.

Хотя я смог игнорировать содержимое каталога,Я хотел проигнорировать, find затем вернул сам каталог как один из результатов, что привело к сбою xgettext в результате (не принимает каталоги; только файлы).

Моё решение было простоиспользуйте grep -v, чтобы пропустить каталог, который мне не нужен в результатах:

find /project/directory -iname '*.php' -or -iname '*.phtml' | grep -iv '/some/directory' | xargs xgettext

Есть ли аргумент для find, который будет работать на 100%, я не могу сказать наверняка.Использование grep было быстрым и простым решением после некоторой головной боли.

3 голосов
/ 18 ноября 2010
find . -name '*.js' -\! -name 'glob-for-excluded-dir' -prune
2 голосов
/ 23 сентября 2013

Ни один из предыдущих ответов не подходит для Ubuntu. Попробуйте это:

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

Я нашел это здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...