Начиная с (обратите внимание на подстановочные знаки до и после «некоторого текста»)
find . -type f -name '*some text*'
как можно исключить / игнорировать все скрытые файлы и каталоги?
Я уже слишком долго искал язык, натолкнулся на что-то необычное и! (восклицательный знак), но нет подходящего (и экономного) примера, который только что сработал.
, который только что сработал | до grep, был бы вариантом, и я бы также приветствуют примеры этого; но в первую очередь меня интересует краткий однострочный (или несколько автономных однострочных линий, иллюстрирующих разные способы достижения одной и той же цели командной строки), просто используя , слишком долго работает в googling [!d4 ].
ps: Найти файлы в Linux и исключить определенные каталоги, кажется, тесно связанными, но a) еще не принят, и b) связанно-но-разным-и-отдельным, но c) может обеспечить вдохновение и помогите определить путаницу!
подстановочные знаки до и после
find . \( ! -regex '.*/\..*' \) -type f -name "whatever", работает. Регулярное выражение ищет «что угодно, потом косую черту, затем точку, затем все» (т. Е. Все скрытые файлы и папки, включая их подпапки) и «!» отрицает регулярное выражение.
Это печатает все файлы, которые являются потомками вашего каталога, пропуская скрытые файлы и каталоги:
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
Это одно из немногих способов исключения точечных файлов, которые также корректно работают на BSD, Mac и Linux:
find "$PWD" -name ".*" -prune -o -print
$PWD печатать полный путь к текущему каталогу, чтобы путь не начинается с ./ -name ".*" -prune соответствует любым файлам или каталогам, начинающимся с точки, а затем не спускаться -o -print означает печать имени файла, если предыдущее выражение ничего не соответствовало. Использование -print или -print0 приводит к тому, что все остальные выражения не печатаются по умолчанию. find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)
Исключает все скрытые каталоги и скрытые файлы в $ DIR
Для этого вам не нужно использовать find. Просто используйте globstar в оболочке it-self, например:
echo **/*foo*
или:
ls **/*foo*
, где **/ представляет любую папку рекурсивно и *foo* любой файл, который имеет [ f7] в имени.
По умолчанию с помощью ls будут печататься имена файлов, за исключением скрытых файлов и каталогов.
Если у вас нет включенного доступа, сделайте это с помощью .
Примечание: новая опция 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
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
Как вы можете see, find использует два правила -name '*hidden_file*' и -and \( -not -name ".*" \), чтобы найти те имена файлов, которые соответствуют обоим условиям - имя файла с hidden_file в нем, но без ведущей точки. Обратите внимание на косые черты перед круглой скобкой - они используются для определения скобок в качестве аргументов find, а для определения подоболочки (что означает, что скобка означает иначе без косых черт)