файлы - поиск исполняемых файлов linux




Как исключить каталог в поиске. команда (20)

Для пользователей FreeBSD :

 find . -name '*.js' -not -path '*exclude/this/dir*'

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

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

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

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

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

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

Использование:

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

... для исключения dir1 AND dir2


Для того, что мне было нужно, он работал так: find landscape.jpg на всем сервере, начиная с root и исключая поиск в каталоге /var :

find / -maxdepth 1 -type d | grep -v /var | xargs -I '{}' find '{}' -name landscape.jpg

find / -maxdepth 1 -type d перечисляет все d- каталоги в /

grep -v /var исключает `/ var 'из списка

xargs -I '{}' find '{}' -name landscape.jpg выполнить любую команду, например, find каждом каталоге / результате из списка


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

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

Или вариант grep grep -v:

find -iname example.com | grep -v beta

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


Если каталоги поиска имеют шаблон (в моем случае большую часть времени); вы можете просто сделать это, как показано ниже:

find ./n* -name "*.tcl" 

В приведенном выше примере; он ищет во всех подкаталогах, начиная с «n».


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

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

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

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

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

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

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


Используйте переключатель prune, например, если вы хотите исключить каталог misc просто добавьте -path ./misc -prune -o в команду find:

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

Вот пример с несколькими каталогами:

find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print

Здесь мы исключаем dir1, dir2 и dir3, так как в выражениях find это действие, которое действует на критерии -path dir1 -o -path dir2 -o -path dir3 (если dir1 или dir2 или dir3), ANDed с type -d , Дальнейшие действия - -o print , просто печать.


Лучше использовать действие exec чем цикл for :

find . -path "./dirtoexclude" -prune \
    -o -exec java -jar config/yuicompressor-2.4.2.jar --type js '{}' -o '{}' \;

exec ... '{}' ... '{}' \; будет выполняться один раз для каждого соответствующего файла, заменяя фигурные скобки '{}' на текущее имя файла.

Обратите внимание, что фигурные скобки заключены в метки одиночной кавычки, чтобы защитить их от интерпретации как пунктуацию скриптового скрипта * .

Заметки

* В разделе ПРИМЕРЫ find (GNU findutils) 4.4.2 страница


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

find . -name '*.js' | grep -v excludeddir

Подход «-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 \)  

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

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

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

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

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


Это единственный, который работал для меня.

find / -name NameOfFile ! -path '*/Directory/*'

Поиск «NameOfFile», за исключением «Directory». Сделайте акцент на звездах *.


Это работает, потому что find TESTS файлы для шаблона « * foo * »:

find ! -path "dir1" ! -path "dir2" -name "*foo*"

но он НЕ работает, если вы не используете шаблон ( find не тестирует файл). Поэтому find не использует свои прежние оцененные « истинные » и « ложные » bools. Пример для нерабочего использования с надписью:

find ! -path "dir1" ! -path "dir2" -type f

ИСТЕЧИ не find ! Поэтому, если вам нужно найти файлы без соответствия шаблону, используйте -prune. Кроме того, использование find черновиков всегда быстрее, в то время как оно действительно пропускает эти каталоги вместо того, чтобы сопоставлять его или лучше не сопоставлять его. Поэтому в этом случае используйте что-то вроде:

find dir -not \( -path "dir1" -prune \) -not \( -path "dir2" -prune \) -type f

или же:

find dir -not \( -path "dir1" -o -path "dir2" -prune \) -type f

С уважением


Это формат, который я использовал для исключения некоторых путей:

$ find ./ -type f -name "pattern" ! -path "excluded path" ! -path "excluded path"

Я использовал это, чтобы найти все файлы, не имеющие путей «. *»:

$ find ./ -type f -name "*" ! -path "./.*" ! -path "./*/.*"

Я нашел имя функции в исходных файлах C исключить * .o и исключить * .swp и исключить (не обычный файл) и исключить вывод dir с помощью этой команды:

find .  \( ! -path "./output/*" \) -a \( -type f \) -a \( ! -name '*.o' \) -a \( ! -name '*.swp' \) | xargs grep -n soc_attach

Я нашел предложения на этой странице, и многие другие страницы просто не работают в моей системе Mac OS X. Тем не менее, я нашел вариант, который работает для меня.

Большая идея - искать Macintosh HD, но избегать перемещения всех внешних томов, которые в основном являются резервными копиями Time Machine, резервными копиями изображений, установленными долями и архивами, но без необходимости их размонтировать, что часто непрактично.

Вот мой рабочий скрипт, который я назвал «findit».

#!/usr/bin/env bash
# inspired by http://.com/questions/4210042/exclude-directory-from-find-command Danile C. Sobral
# using special syntax to avoid traversing. 
# However, logic is refactored because the Sobral version still traverses 
# everything on my system

echo ============================
echo find - from cwd, omitting external volumes
date
echo Enter sudo password if requested
sudo find . -not \( \
-path ./Volumes/Archive -prune -o \
-path ./Volumes/Boot\ OS\ X -prune -o \
-path ./Volumes/C \
-path ./Volumes/Data -prune -o \
-path ./Volumes/jas -prune -o \
-path ./Volumes/Recovery\ HD -prune -o \
-path ./Volumes/Time\ Machine\ Backups -prune -o \
-path ./Volumes/SuperDuper\ Image -prune -o \
-path ./Volumes/userland -prune \
\) -name "$1" -print
date
echo ============================
iMac2:~ jas$

Различные пути связаны с внешними объемами архива, Time Machine, Virtual Machines, другими установленными серверами и т. Д. Некоторые имена томов содержат пробелы.

Хорошим тестовым прогоном является «findit index.php», потому что этот файл происходит во многих местах моей системы. С помощью этого сценария для поиска основного жесткого диска требуется около 10 минут. Без этих исключений требуется много часов.


Я предпочитаю « -not обозначать» ... это более читаемо:

find . -name '*.js' -and -not -path directory

Я считаю следующее легче рассуждать, чем другие предлагаемые решения:

find build -not \( -path build/external -prune \) -name \*.js

Это происходит из фактического варианта использования, когда мне нужно было называть yui-compress на некоторых файлах, созданных wintersmith, но не оставлять другие файлы, которые необходимо отправить как есть.

Внутри \( и \) - это выражение, которое будет точно соответствовать build/external (оно не будет соответствовать, если вы find ./build , например, в этом случае вам нужно изменить его на ./build/external ) и будет, на успех, избегать прохождения чего-либо ниже . Затем это сгруппировано как одно выражение с экранированной скобкой и с префиксом -not которое заставит find пропускать все, что соответствовало этому выражению.

Можно спросить, добавляет ли добавление -not не все остальные файлы, скрытые от -prune , и ответ не будет. Способ -prune работает в том, что все, что после того, как оно будет достигнуто, файлы ниже этого каталога будут постоянно игнорироваться.

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

find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js

Лоуренс Гонсалвис (Laurence Gonsalves) о том, как « -prune - это отличный how-to-use-prune-option-of-find-in-sh .

И вот общее решение:

find /path/to/search                    \
  -type d                               \
    \( -path /path/to/search/exclude_me \
       -o                               \
       -name exclude_me_too_anywhere    \
     \)                                 \
    -prune                              \
  -o                                    \
  -type f -name '*\.js' -print

Чтобы избежать ввода /path/to/seach/ несколько раз, оберните find в pushd .. popd .

pushd /path/to/search;                  \
find .                                  \
  -type d                               \
    \( -path ./exclude_me               \
       -o                               \
       -name exclude_me_too_anywhere    \
     \)                                 \
    -prune                              \
  -o                                    \
  -type f -name '*\.js' -print;         \
 popd

 find . -name '*.js' -\! -name 'glob-for-excluded-dir' -prune




find