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

85

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

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

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

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

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

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

Edit

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

    
задан nutty about natty 10.03.2013 в 12:58
источник

6 ответов

3

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

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

    
ответ дан nutty about natty 11.08.2015 в 09:31
источник
92

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

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
    
ответ дан Flimm 09.07.2013 в 18:30
6

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

find "$PWD" -name ".*" -prune -o -print
  • $PWD распечатать полный путь к текущему каталогу, чтобы путь не начинался с ./
  • -name ".*" -prune соответствует любым файлам или каталогам, которые начинаются с точки, а затем не спускаются
  • -o -print означает печать имени файла, если предыдущее выражение ничего не соответствовало. Использование -print или -print0 заставляет все остальные выражения не печатать по умолчанию.
ответ дан eradman 24.03.2016 в 14:51
4
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

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

    
ответ дан guest 28.02.2014 в 01:49
3

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

echo **/*foo*

или

ls **/*foo*

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

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

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

Примечание: Новый вариант подгонки работает в 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
    
ответ дан kenorb 20.04.2015 в 11:49
1

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 , а для определения подоболочки (что означает, что скобки означают иначе без косых черт)

    
ответ дан Sergiy Kolodyazhnyy 16.05.2017 в 00:01