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 быстрее)! См. здесь и здесь. Вы также можете локально искать на страницах поиска мужчин строки \( и \) с экранированными строками поиска \\\( и \\\) соответственно).
Дополнительное объяснение:
- [ЛУЧШЕЕ, в зависимости от того, что вы хотите] Это РАБОТАЕТ! Исключите все файлы и папки внутри dir_to_exclude в корне того места, где вы ищете. Обратите внимание, что при этом исключаются все подфайлы и подпапки внутри dir_to_exclude , но НЕ исключается сам каталог dir_to_exclude.
- Также исключите саму директорию dir_to_exclude (и любой файл или папку с именем, начинающимся с этих символов). Предостережение: это также исключает dir_to_exclude1 , dir_to_exclude2 , dir_to_exclude_anyTextHere и т. д. Он исключает ЛЮБОЙ файл или папку, которые просто начинаются с текста dir_to_exclude и находятся в корневом каталоге места поиска.
- [ЛУЧШЕ, в зависимости от того, что вы хотите] рекурсивно исключить каталог с этим именем на любом уровне вашего пути поиска. Просто добавьте подстановочный знак * в начало пути, а не используйте расширение . для указания корневого каталога поиска.
- Рекурсивно исключить любой файл или папку с именем, начинающимся с символов dir_to_exclude на любом уровне пути поиска. (См. также предостережение выше).
Обзор:
В ./ файл . в начале означает «начать в текущем каталоге» (или в */ , * — это подстановочный знак для выбора любых символов до этой точки), а в /* в конце — * является подстановочным знаком для выбора любых символов в строке пути после символа /. Это означает следующее:
- "./dir_to_exclude/*" соответствует всем подфайлам и подпапкам внутри dir_to_exclude в корневом каталоге поиска ( ./ ), но НЕ соответствует самому каталогу.
- "./dir_to_exclude*" соответствует всем файлам и папкам в корневом каталоге поиска ( ./ ), включая dir_to_exclude , а также всему содержимому в нем, но также с оговоркой, он будет соответствовать любое имя файла или папки, начинающееся с символов dir_to_exclude .
- "*/dir_to_exclude/*" соответствует всем подфайлам и подпапкам внутри dir_to_exclude в любом каталоге на любом уровне пути поиска ( */ ), но НЕ соответствует самому каталогу.
- "*/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-й части условия.
Единственная разница здесь в том, что оператор печати также присутствует в первой половине. <р>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 " указывает исключить только этот путь. Поскольку конкретный путь был исключен таким образом, сокращение вообще не требуется.
Читайте также: