Linux найти, исключить каталог из поиска

Обновлено: 21.11.2024

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

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

45 ответов 45

Если -prune вам не подходит, выполните следующие действия:

Предупреждение: необходимо пройти по всем нежелательным каталогам.

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

Отличный ответ. Я бы добавил к этому, что вы можете исключить каталог на ЛЮБОМ уровне, изменив первый файл . к * . поэтому find -name "*.js" -not -path "*/omitme/*" пропустит файлы из каталога с именем "omitme" на любом уровне глубины.

Было бы лучше сказать "Это альтернатива использованию -prune". Ответы, предлагающие -prune, явно не являются неправильными, просто они не так, как вы бы это сделали.

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

Чтобы исключить несколько каталогов, ИЛИ их между скобками.

Чтобы исключить каталоги с определенным именем на любом уровне, используйте первичное -name вместо -path .

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

Поскольку это принятый ответ, я считаю, что здесь следует упомянуть, что причина -print должна быть добавлена ​​​​в конец, чтобы предотвратить поведение по умолчанию, которое заключается в том, чтобы также печатать имена удаленных каталогов. @cycollins хорошо объясняет это в другом ответе.

найти . -type d \( -path "./Library/*" -o -path "./.Trash" \) -prune -o -name '.DS_Store' -print0 | xargs -0 rm From ~/ на моем Mac прекрасно очищает его :)

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

Важное примечание: пути, которые вы вводите после -path, должны точно совпадать с теми, которые были бы напечатаны без исключений. Если это предложение сбивает с толку, просто убедитесь, что вы используете полные пути в команде whole, например: find /full/path/ -not \( -path /full/path/exclude/this -prune \ ). . См. примечание [1], если вы хотите получить более полное представление.

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

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

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

Примечание [1]: Если вы хотите исключить /tmp/foo/bar и запускаете команду find следующим образом: « find /tmp \(. », тогда вы должны указать -path /tmp/foo/bar . Если на другом вручную вы запускаете find следующим образом cd /tmp; find . \(. тогда вы должны указать -path ./foo/bar .

Отличный ответ, спасибо. Это работает и масштабируется (читается) для множественных исключений. Вы джентльмены и ученый сэр. Спасибо за пример множественных исключений

Это не работает, если я хочу использовать переключатель -delete: find . -not \( -path ./CVS -prune \) -type f -mtime +100 -delete find: Действие -delete автоматически включает -depth, но -prune ничего не делает, когда действует -depth. Если вы все равно хотите продолжить, просто явно используйте параметр -depth.

Изучив вывод find , это действительно очевидно, но меня это сбило с толку. Если вы ищете в текущем каталоге (указав . в качестве пути поиска или не указав его вообще), вы, скорее всего, хотите, чтобы ваш шаблон после -path начинался с ./ , например: find -not \( -path . /.git -prune \) -type f .

Более точный (и совместимый с POSIX) вариант этого метода: find searchdir \! \( -type d \( -path './excludedir/*' -o -path './excludedir2/*' -o -path './excludedir3/*' \) -prune \) с последующими любыми условиями, которые должны соответствует тому, что вы ищете.

Здесь явно присутствует некоторая путаница в отношении предпочтительного синтаксиса для пропуска каталога.

Мнение GNU

Обоснование

-prune останавливает find от спуска в каталог. Простое указание -not -path все равно приведет к каталогу skiped, но -not -path будет ложным всякий раз, когда find проверяет каждый файл.

Проблемы с параметром -prune

-prune делает то, для чего предназначен, но все же есть некоторые вещи, о которых вы должны позаботиться при его использовании.

find выводит сокращенный каталог.

  • TRUE Это предполагаемое поведение, оно просто не сводится к нему.Чтобы вообще не печатать каталог, используйте синтаксис, который логически исключает его.

-prune работает только с -print и никакими другими действиями.

  • НЕ ПРАВДА. -prune работает с любым действием, кроме -delete. Почему это не работает с удалением? Чтобы -delete сработало, find должен пройти каталог в порядке DFS, так как -delete сначала удалит листья, затем их родителей и т. д. Но для того, чтобы указание -prune имело смысл, find должен попасть в каталог и прекратить спуск по нему, что явно не имеет смысла при включенных -depth или -delete.

Производительность

Я провел простую проверку трех наиболее популярных ответов на этот вопрос (заменил -print на -exec bash -c 'echo $0' <> \; чтобы показать еще один пример действия). Результаты ниже

Заключение

Синтаксис f10bit и синтаксис Daniel C. Sobral выполнялись в среднем за 10–25 мс. Синтаксис GetFree, который не использует -prune, занял 865 мс. Итак, да, это довольно экстремальный пример, но если вы заботитесь о времени выполнения и делаете что-то удаленно интенсивное, вам следует использовать -prune .

Примечание. Синтаксис Даниэля С. Собрала работает лучше из двух синтаксисов -prune; но я сильно подозреваю, что это результат некоторого кэширования, поскольку переключение порядка выполнения двух приводило к противоположному результату, в то время как версия без обрезки всегда была самой медленной.

После нескольких тестов этих двух с параметром -prune я могу сказать, что разницы практически нет. Имейте в виду, что какая команда запустится первой, выиграет от производительности процессора, более поздний прогрев процессора > падение производительности вызовет незначительное замедление (я очищал кеш перед каждой командой, как предложил @ndemou)

Попробуйте переключить номер между name1() name2() name3() в тестовом скрипте @BroSlow выше, чтобы изменить порядок выполнения, чтобы получить визуальное представление о том, что я сказал. Однако в реальной жизни это незаметно между этими двумя.

Вы не должны использовать -o, что означает или. так что вы сокращаете на первом этапе, а затем забываете об этом на следующем.

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

Поиск «Мой файл», исключая «Каталог». Сделайте акцент на звездочках * .

Обратите внимание, что вы можете добавить несколько ! -path '*/Directory/*' к вашей команде последовательно, чтобы игнорировать несколько каталогов

Мне отлично удалось найти собственные файлы package.json: find . -имя package.json ! -путь '*/node_modules/*'

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

Медленно работает с большими результатами, но полезно для небольших наборов. Но как исключить несколько каталогов с помощью grep? Конечно так: найти . -имя '*.js' | grep -v исключенный каталог | grep -v исключеноir2 | grep -v excludeir3, но может быть какой-то один способ grep.

Если вы хотите выполнить несколько greps, вам лучше записать их в виде регулярных выражений: egrep -v '(dir1|dir2|dir3)' . Однако в этом конкретном примере было бы лучше исключить каталоги из самого поиска.

да, и вам не нужны круглые скобки, и было бы лучше использовать ^, чтобы убедиться, что оно соответствует имени каталога в начале строки, например: find . -имя '*.js' | egrep -v "^\./исключенный_каталог1|^\./исключенный_каталог2"

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

К сожалению, это не работает. На странице руководства по поиску сказано: «Чтобы игнорировать каталог и файлы в нем, используйте -prune».

Это неправильно. Это не мешает find войти в каталог и просмотреть все файлы внутри.

Используйте параметр -prune. Итак, что-то вроде:

'-type d -name proc -prune' ищет только каталоги с именем proc для исключения.
Операция "-o" является оператором "ИЛИ".

Это единственное чистое "найти" решение, которое сработало для меня. Каталоги, которые я хотел исключить, НЕ находятся непосредственно под текущим рабочим каталогом.

Однако добавление -print в конец может улучшить результаты. найти . -type d -name .hg -prune -o -name данные игнорировали содержимое (нескольких) каталогов .hg, но отображали сами каталоги .hg. С -print он перечислил только каталоги «данных», которые я искал.

да, гораздо лучше объяснено, чем принятый ответ. и это работает. Вот разновидность, которая находит уценки, за исключением тех, которые находятся в /node_modules/ : find . -name node_modules -prune -o -name '*.md' Нет ничего плохого в том, чтобы добавить дополнительные функции, такие как -print, но, по крайней мере, сначала нужно иметь что-то основное, что работает.

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

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

: Сначала поместите все аргументы, связанные с путем, например . -дорожка './dir1' -prune -o

: мне больше всего удается поставить -name, -iname и т. д. в качестве последней опции в этой группе. Например. -type f -iname '*.js'

: вам нужно добавить -print при использовании -prune

Вот рабочий пример:

Протестировано в Linux Ubuntu 18.04 и 20.04.

Обратите внимание, что ./ (или */ , см. ниже) перед и /* (или * , но см. предостережение ниже) после имени папки для exclude требуются для исключения dir_to_exclude и всего, что в нем находится!

Кроме того, для скорости и чтобы не перемещаться по исключенным каталогам, обратите внимание на очень важную скрытую группирующую скобку и параметр -prune. Пример: find -not \( -path "*/dir_to_exclude/*" -prune \) .

Чтобы увидеть примеры этих экранированных скобок группировки на страницах руководства, запустите man find , а затем нажмите / для поиска. Найдите шаблон \( , например, используя шаблон регулярного выражения \\\( . Нажмите Enter, чтобы начать поиск справочных страниц. Нажмите N для «следующего совпадения» во время поиска.

Обзор

Эти работы:

[ИСПОЛЬЗУЙТЕ ЭТИ] Они тоже работают и ЛУЧШЕ, потому что они заставляют find НЕ проходить без необходимости по исключенным путям!:
(Это дает огромную разницу в скорости (в 2x~100x быстрее)! См. здесь и здесь. Вы также можете локально искать на страницах поиска мужчин строки \( и \) с экранированными строками поиска \\\( и \\\) соответственно).

<р>. но они НЕ работают:

Дополнительное объяснение:

  1. [ЛУЧШЕЕ, в зависимости от того, что вы хотите] Это РАБОТАЕТ! Исключите все файлы и папки внутри dir_to_exclude в корне того места, где вы ищете. Обратите внимание, что при этом исключаются все подфайлы и подпапки внутри dir_to_exclude , но НЕ исключается сам каталог dir_to_exclude.
  2. Также исключите саму директорию dir_to_exclude (и любой файл или папку с именем, начинающимся с этих символов). Предостережение: это также исключает dir_to_exclude1 , dir_to_exclude2 , dir_to_exclude_anyTextHere и т. д. Он исключает ЛЮБОЙ файл или папку, которые просто начинаются с текста dir_to_exclude и находятся в корневом каталоге места поиска.
  3. [ЛУЧШЕ, в зависимости от того, что вы хотите] рекурсивно исключить каталог с этим именем на любом уровне вашего пути поиска. Просто добавьте подстановочный знак * в начало пути, а не используйте расширение . для указания корневого каталога поиска.
  4. Рекурсивно исключить любой файл или папку с именем, начинающимся с символов dir_to_exclude на любом уровне пути поиска. (См. также предостережение выше).

Обзор:

В ./ файл . в начале означает «начать в текущем каталоге» (или в */ , * — это подстановочный знак для выбора любых символов до этой точки), а в /* в конце — * является подстановочным знаком для выбора любых символов в строке пути после символа /. Это означает следующее:

  1. "./dir_to_exclude/*" соответствует всем подфайлам и подпапкам внутри dir_to_exclude в корневом каталоге поиска ( ./ ), но НЕ соответствует самому каталогу.
  2. "./dir_to_exclude*" соответствует всем файлам и папкам в корневом каталоге поиска ( ./ ), включая dir_to_exclude , а также всему содержимому в нем, но также с оговоркой, он будет соответствовать любое имя файла или папки, начинающееся с символов dir_to_exclude .
  3. "*/dir_to_exclude/*" соответствует всем подфайлам и подпапкам внутри dir_to_exclude в любом каталоге на любом уровне пути поиска ( */ ), но НЕ соответствует самому каталогу.
  4. "*/dir_to_exclude*" соответствует всем файлам и папкам на любом уровне ( */ ) пути поиска с именем, начинающимся с dir_to_exclude .

Дальше

Оттуда я предпочитаю использовать конвейер для grep для поиска определенных совпадающих шаблонов на интересующих путях. Пример: найдите любой путь, который НЕ находится внутри каталога dir_to_exclude и в котором есть требуемое_имя_файла.txt:

Чтобы исключить несколько совпадающих шаблонов, просто используйте -not \( -path "*/matching pattern/*" -prune \) несколько раз. Пример:

Я использую приведенный выше пример как часть своего псевдонима sublf здесь (обновление: вместо этого этот псевдоним расширяется и перемещается в скрипт sublf.sh в этой папке). Этот псевдоним позволяет мне использовать fzf fuzzy finder для быстрого поиска и открытия нескольких файлов в Sublime Text. См. ссылки выше для последней версии.

Ссылки:

См. также:

Ключевые слова: исключить каталог из команды поиска; не искать путь с помощью find; нечувствительные к регистру команды find и grep

@holms, у меня нет Mac, но руководство MacOs по поиску показывает, что -not и -path поддерживаются, так что есть идеи, почему это не работает или как заставить его работать на Mac?

На самом деле мне это не помогло. Причина в том, что «это работает» нужно заменить на find -not -path «./dir_to_exclude*» без последней косой черты.В вашей версии по-прежнему указан dir_to_exclude.

@emk2203, я понимаю, что вы имеете в виду, и в результате я значительно обновил свой ответ. Я по-прежнему предпочитаю шаблон сопоставления "./dir_to_exclude/*" , поскольку "./dir_to_exclude*" будет иметь непреднамеренный побочный эффект сопоставления любого файла или папки, которые начинаются со строки dir_to_exclude , например dir_to_exclude1 , dir_to_exclude2 , dir_to_exclude какая-то другая строка и т. д.

Ситуация, в которой я столкнулся с этим, была при передаче имен файлов в tar . Когда dir_to_exclude все еще находится в выводе, даже если файлов нет, каталог и его содержимое тем не менее сжимаются и добавляются в архив. Я согласен с вашими опасениями, но бывают случаи, когда вам приходится также исключать каталог или желаемое действие не выполняется.

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

Я использовал это, чтобы найти все файлы не в путях ".*":

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

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

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

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

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

У всех есть решение, но вы объяснили его лучше всего. Я был непреклонен в том, чтобы сначала использовать -name, а не -path. Твоего объяснения было достаточно, чтобы прийти к тому, чего я хотел. найти . -name "*.txt" -print -o -path ./misc -prune

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

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

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

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

хорошим приемом, позволяющим избежать печати обрезанных каталогов, является использование -print (работает и для -exec) после правой стороны -или после -prune . Например, .

напечатает путь ко всем файлам в текущем каталоге с расширением `.j2", пропуская все скрытые каталоги. Аккуратно. Но он также напечатает полный путь каждого пропускаемого каталога, как указано выше. Однако следующее не соответствует .

потому что по логике есть скрытый -and после оператора -iname и перед -print. Это привязывает его к правой части предложения -or из-за логического порядка операций и ассоциативности. Но в документах говорится, что есть скрытый -print, если он (или любой из его кузенов . -print0 и т. д.) не указан. Так почему же левая часть -or не печатается? По-видимому (и я не понял этого из моего первого прочтения справочной страницы), это верно, если нет -print -или -exec НИГДЕ, и в этом случае -print логически разбросан вокруг так, что все будет напечатано. Если хотя бы ОДНА операция в стиле печати выражена в каком-либо предложении, все эти скрытые логические операции исчезают, и вы получаете только то, что указываете. Честно говоря, я мог бы предпочесть, чтобы было наоборот, но тогда поиск только с описательными операторами, по-видимому, ничего не дал бы, так что я думаю, что это имеет смысл и так. Как упоминалось выше, все это работает и с -exec, поэтому ниже приводится полный список ls -la для каждого файла с желаемым расширением, но не список первого уровня каждого скрытого каталога, .

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

Трудно ошибиться, разделив мир таким образом на две части. Я надеюсь, что это поможет, хотя маловероятно, что кто-то дочитает до 30+ ответа и проголосует за него, но можно надеяться. :-)

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

В качестве примера воспользуемся следующей структурой каталогов.Здесь у нас есть папка «Рецепты», которая содержит три региона: индийский, итальянский и тайский. В каждом из этих каталогов есть рецепты. Все они содержат файлris.txt.

Если бы мы выполнили поиск по файлу "ris.txt" с помощью команды find, она вернула бы все три файла.

Не выполнять поиск в определенном каталоге с помощью функции «Найти»

Допустим, мы хотим исключить итальянский каталог из нашего поиска. Мы можем использовать параметры not ( ! ), path ( -path ) и prune ( -prune ), например.

Это успешно исключило find из поиска в итальянском каталоге.

Давайте разберем команду, чтобы лучше понять ее. Команда начинается с find, за которым следует . , что означает текущий каталог. За этим следует ! что означает «не», что также может быть записано как -not. Затем у нас есть выражение, заключенное в круглые скобки, что обеспечивает приоритет. Внутри круглых скобок стоит -path, за которым следует путь, который мы хотим исключить. -prune означает, что если выражение является каталогом, не выполнять поиск внутри него. Затем мы заканчиваем -name, за которым следует имя файла, который мы ищем.

Исключить несколько каталогов из результатов поиска

Часть команды, которая исключает каталог из поиска:

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

Заключение

Теперь вы должны чувствовать себя достаточно комфортно, чтобы исключить каталоги из поиска с помощью команды find. Я часто использовал это, потому что в моей системе есть два очень больших диска с сопоставленными с ними данными объемом более 4 ТБ. Когда я выполняю обычный поиск от root, он также будет искать эти диски, поскольку они смонтированы под root.

Сначала это может показаться сложным, но как только вы поймете используемые операторы и выражения, все станет ясно. Чтобы узнать больше о команде find, воспользуйтесь ссылками в разделе ресурсов ниже.

В Linux команда find используется для поиска файлов или папок из командной строки. Это сложная команда с большим количеством параметров, аргументов и режимов.

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

Например, для поиска файлов с именами, начинающимися с «file_», мы можем запустить:

Поиск файлов с именами файлов

Как вы можете видеть выше, он выводит полные пути к файлам, возвращаемым поиском. Здесь '.' подразумевает текущий каталог. Find будет искать шаблон имени файла в текущем каталоге, во всех подкаталогах и так далее до самого глубокого уровня файловой структуры. Точно так же вы можете использовать любой другой каталог вместо '.' .

Исключить каталог при поиске файлов

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

Чтобы исключить каталог из поиска, используйте аргумент '-prune':

Давайте сначала проанализируем, что здесь происходит.

Часть "-name './test' -prune" означает: исключить папку "test" из поиска. После этого '-o' сообщает команде: что еще нужно сделать после того, как команда исключит 'test'. Мы просто передаем сюда шаблон, описанный в предыдущем примере.

Теперь этот шаблон будет работать во всех папках, кроме «тестовой».

Исключить каталог в команде поиска

Теперь вы можете видеть, что поиск действительно исключает папку «тест». Однако печатается само имя папки.

Исключить имя каталога из результатов поиска

Чтобы избежать этого, просто добавьте "-print" в конце. Этот параметр исключит имя каталога из вывода.

Исключить имя каталога в команде поиска

Теперь шаблон искал файлы в текущем каталоге и исключал тестовый каталог.

Заключение

В этой статье мы увидели, как исключить каталог при поиске файлов с помощью команды find. Обратите внимание, что примеры, приведенные в этой статье, представляют собой поиск файлов на основе имен файлов ('-name'). Есть много других способов поиска файлов с помощью команды find. Обязательно обратитесь к справочной странице команды find, чтобы подробно изучить их.

Спасибо за прочтение. Не стесняйтесь оставлять отзывы или вопросы в комментариях ниже.

Страницы

Четверг, 19 июля 2012 г.

команда find: 15 примеров исключения каталогов с помощью сокращения

Когда мы ищем файлы в Unix/Linux с помощью команды find, нам может понадобиться искать файлы только в некоторых определенных каталогах ИЛИ искать во всех каталогах, кроме определенного каталога, и так далее. Параметр prune в команде find предназначен для исключения каталога из дерева каталогов. В этой статье о команде find мы будем использовать параметр prune команды find, чтобы исключить каталоги с некоторыми примерами.

Приведенная ниже простая команда find выводит список всех файлов и каталогов в дереве каталогов. . указывает путь для поиска файлов. Мы увидим использование prune с помощью этого дерева каталогов:

Функции prune просты: "Если файл является каталогом, не спускайтесь и не переходите в него". Звучит просто, не так ли? Приведем несколько примеров:

1. Использование обрезки:

Команда find работает следующим образом: она начинает поиск файлов по пути, указанному в команде, который в данном случае является текущим каталогом (.). Отсюда он проходит через все файлы во всем дереве и печатает те файлы, которые соответствуют указанным критериям. -prune не позволит команде find спуститься дальше в файл, если это каталог. Следовательно, когда find начинается с текущего каталога, prune не позволяет ему спускаться по текущему каталогу, поскольку он сам является каталогом, и, следовательно, печатается только текущий каталог, а не файлы в каталоге. Печать происходит здесь, потому что функция find по умолчанию печатает все, что истинно.

"! -name . " означает любой файл, кроме текущего каталога. Итак, prune удалит все каталоги, кроме текущего каталога. Следовательно, в конечном итоге это не позволит find спуститься в любой подкаталог в текущем каталоге, в результате мы получим все файлы и каталоги, присутствующие в указанном пути.

Имейте в виду, что команда find принимает путь или ряд путей для поиска. Этот ./* транслируется во все файлы и каталоги в текущем каталоге. Итак, из этого списка prune предотвратит спуск в подкаталоги. Примечание. Этот подход не рекомендуется, потому что i) мы должны указать только каталоги в пути поиска find, ii) если список файлов и каталогов огромен, команда будет иметь проблемы с производительностью.

'-name temp' говорит искать все файлы с именем temp. prune указывает не переходить в каталоги с именем temp. Следовательно, вывод представляет собой список всех файлов и каталогов с именем temp. В данном случае prune удалось добиться того, что если бы файл с именем temp находился внутри любого каталога temp, он бы не был напечатан.

-o — оператор ИЛИ. find удалит каталоги с именем temp. Из-за условия ИЛИ все остальные файлы (кроме тех, которые находятся во временном каталоге) распечатываются.
Вы ожидали, что временный каталог будет распечатан? В последнем примере мы видели, что каталоги ./temp и ./C/temp печатались, но не сейчас. Это эффект опции -print. По умолчанию команда find печатает все файлы, соответствующие критериям. Однако, как только указана опция -print, она будет печатать файлы только по явным инструкциям печати. В этой команде find параметр -print связан с другой стороной условия ИЛИ, поэтому ничего не будет напечатано из 1-й части условия.

<р>6. Найдите все файлы, кроме тех, которые находятся во временном каталоге. Также распечатайте временные каталоги, если они есть:
Единственная разница здесь в том, что оператор печати также присутствует в первой половине.

<р>7. Найдите все файлы .c, кроме тех, которые находятся в каталоге C:
Первая часть удаляет каталоги C. Во второй части находятся и распечатываются все файлы .c, кроме тех, которые присутствуют в C.

<р>8. Найдите все файлы .c, кроме тех, которые находятся в каталоге C и temp:
Чтобы указать несколько каталогов с параметром -name, следует использовать -o в качестве условия ИЛИ.

<р>9. Найти все файлы, измененные за последний день, кроме тех, которые находятся во временном каталоге:
Использование mtime заставляет find искать файлы, измененные только за последний день.

<р>10. Найти только обычные файлы, измененные за последний день, за исключением тех, которые находятся во временном каталоге:
Используя параметр -type f, find найдет только обычные файлы.

<р>11. Найти все файлы с правами доступа 644, кроме тех, которые находятся во временном каталоге: опция
-perm в поиске позволяет найти файлы с определенными правами доступа.разрешение 644 указывает на файлы с разрешением rw-r--r--.

<р>12. То же самое с опцией полного имени и сокращением для исключения каталога:

find имеет переключатель с названием "полное имя". Скажем, в вашем дереве каталогов может быть более одного каталога temp. Более ранние подходы удалят все каталоги temp. В случае, если требуется удалить определенный каталог temp, вы можете указать путь к самому каталогу. Примечание. Путь, указанный в параметре fullname, должен относиться к указанному пути поиска, а не к абсолютному пути.

13. Использование exec и prune для исключения каталога вместо имени:
Еще один способ. Используя exec, можно поставить условие, чтобы проверить, является ли текущий файл «временным». Если это так, обрежьте его. «<>» — это файл, найденный командой find.

14. Использование inum и prune для исключения каталога вместо имени:
То же самое, но с использованием номера инода временного каталога. номер индекса указывается с помощью параметра inum.

15. Найдите список всех файлов .c, кроме тех, которые находятся в каталоге C, без использования обрезки: опция
-path аналогична опции -wholename. Он используется для указания конкретного пути для поиска. В этом случае, '! -path " указывает исключить только этот путь. Поскольку конкретный путь был исключен таким образом, сокращение вообще не требуется.

Читайте также: