Вопрос Как исключить / игнорировать скрытые файлы и каталоги в подстановочном «поиске» поиска?


Начиная с (обратите внимание на подстановочные знаки до и после «некоторый текст»)

find . -type f -name '*some text*'

как можно исключить / игнорировать все скрытые файлы и каталоги?

Я уже слишком долго искал, натолкнулся на какую-то -другую и! (восклицательный знак), но нет подходящего (и экономного) примера который только что сработал,

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

пс: Поиск файлов в Linux и исключение определенных каталогов кажется близким, но а) еще не принято, и б) связанно-но-разным-и-отдельным, но в) может обеспечить вдохновение и помочь определить путаницу!

редактировать

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", работает. Регулярное выражение ищет «что угодно, потом косую черту, затем точку, затем все» (т. Е. Все скрытые файлы и папки, включая их подпапки) и «!» отрицает регулярное выражение.


102
2018-03-10 11:58


происхождения


Не помогает с тем, что вы просили в своем редактировании, но посмотрите на мой вопрос и его ответ здесь: unix.stackexchange.com/q/69164/15760 а также ссылку в ответе.
Связанный: Исключить скрытые файлы при поиске с помощью Unix / Linux? - kenorb


ответы:


Это печатает все файлы, являющиеся потомками вашего каталога, пропускающие скрытые файлы и каталоги:

find . -not -path '*/\.*'

Поэтому, если вы ищете файл с some text в его имени, и вы хотите пропустить скрытые файлы и каталоги, запустите:

find . -not -path '*/\.*' -type f -name '*some text*'

Объяснение:

-path Параметр запуска проверяет шаблон на всю строку пути. * является подстановочным знаком, / является разделителем каталогов, \. является точкой (ее нужно избегать, чтобы избежать особого значения), и * это еще один шаблон. -not средства не выбирают файлы, соответствующие этому тесту.

Я не думаю, что find достаточно умен, чтобы избежать рекурсивного поиска скрытых каталогов в предыдущей команде, поэтому, если вам нужна скорость, используйте -prune вместо этого, вот так:

 find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print

109
2017-07-09 16:30



Обратите внимание, что последнее, что вам нужно, -print в конце! Кроме того, не уверен, что -name '\.*' would be more efficient instead of -path` (потому что путь ищет подпапки, но они будут обрезаны) - artfulrobot
Каково особое значение . в данном контексте? - frostschutz
@frostschutz Точка после find означает текущий каталог: find будет просматривать все файлы и каталоги в текущем каталоге. Аргумент после path является регулярным выражением, где точка обычно означает «любой символ», чтобы это означало буквальную точку, которую мы должны избегать с обратной косой чертой. Аргумент после -name  не регулярное выражение, но оно расширяет подстановочные знаки, такие как ? а также * как оболочка. - Flimm
@frostschutz На самом деле, подумайте об этом, я могу ошибаться . имеющий особое значение. - Flimm
@Flimm yup, не нужно бежать ., Насколько мне известно, нужно избегать только этих: *, ?, а также [], - thdoan


Это одно из немногих способов исключения точечных файлов, которые также корректно работают на BSD, Mac и Linux:

find "$PWD" -name ".*" -prune -o -print
  • $PWD напечатайте полный путь к текущему каталогу, чтобы путь не начинался с ./
  • -name ".*" -prune соответствует любым файлам или каталогам, которые начинаются с точки, а затем не спускаются
  • -o -print означает печать имени файла, если предыдущее выражение ничего не соответствовало. С помощью -print или -print0 заставляет все остальные выражения не печатать по умолчанию.

6
2018-03-24 13:51



Пожалуйста, объясните / уточните «тревожно сложно»; ответы уже даны, и ваш ответ, похоже, свидетельствует об обратном ...? - nutty about natty
«тревожно сложный», вероятно, чрезмерный. Я переформулировал ответ, чтобы понять. Я думаю, что ответ, который я написал, трудно понять, и его трудно увидеть, не очень внимательно прочитав страницу руководства. Если ты только используя GNU find, тогда есть более возможные решения. - eradman
-o ... -print полезно. Для моего использования у меня теперь есть find ... '!' -name . -name '.*' -prune -o ... -print, что было более удобным, чем включение $ PWD. - Roger Pate
$ PWD, вероятно, следует указывать, если в нем есть место. - Daniel James
@ Даниэль Джеймс действительно, $PWD следует указывать - eradman


find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

Исключает все скрытые каталоги и скрытые файлы в формате $ DIR


4
2018-02-28 00:49



Это идеальный ответ. Он рекурсивно находит все файлы, но исключает позиции для каталогов и скрытых файлов. Благодаря! - KyleFarris


  ответ Я первоначально опубликовал как «редактирование» к моему первоначальному вопросу выше:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", работает. Регулярное выражение ищет «что угодно, потом косую черту, затем точку, затем все» (т. Е. Все скрытые файлы и папки, включая их подпапки) и «!» отрицает регулярное выражение.


3
2017-08-11 07:31



Аналогично, но только для текущей папки: find . \( ! -regex './\..*' \) -type f -maxdepth 1 -print - phyatt


Вам не нужно использовать find для этого. Просто используйте globstar в shell it-self, например:

echo **/*foo*

или:

ls **/*foo*

где **/ представляет любую папку рекурсивно и *foo* любой файл, foo от его имени.

По умолчанию используется ls будет печатать имена файлов, исключая скрытые файлы и каталоги.

Если у вас нет включенного доступа, сделайте это shopt -s globstar,

Заметка: Новая опция globbingработает в Bash 4, zsh и подобных оболочках.


Пример:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden

3
2018-04-20 09:49



Вам не нужно ls для этого! echo **/*foo* - Kevin Cox
@kenorb (и @ kevin-cox). Не могли бы вы быть немного более подробными? Почему здесь работает globstar (= *) и как? Что делает слэш / делать? - nutty about natty
@nuttyaboutnatty / означает папку, она отделяет каталоги от имени файла. * в основном представляет все. - kenorb
@kenorb yes-but: как этот однострочный шрифт помогает с исходным вопросом? - nutty about natty
@nuttyaboutnatty Уточненный и добавленный пример. Это помогает найти файлы, игнорирующие скрытые. - kenorb


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

$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt                                                 

$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)                            
./non_hidden_file.txt

Как вы видете, find использует два правила -name '*hidden_file*' а также -and \( -not -name ".*" \) найти те имена файлов, которые соответствуют обоим условиям - имя файла с hidden_file в нем, но без ведущей точки. Обратите внимание на косые черты перед круглой скобкой - они используются для определения скобок как find аргументы, скорее определяющие подоболочку (что означает, что скобки означают иначе без косых черт)


1
2018-05-15 22:01