Начиная с (обратите внимание на подстановочные знаки до и после «некоторого текста»)
find . -type f -name '*some text*'
Как можно исключить / игнорировать все скрытые файлы и каталоги?
Я уже слишком долго гуглил, наткнулся на какую-то черту и! (восклицательный знак) параметров, но нет подходящего (и экономного) примера, который просто работал .
Трубопровод |
для grep
будет вариант , и я бы также приветствовать примеры этого; но в первую очередь меня интересует краткий однострочный (или пара отдельных однострочных, иллюстрирующих различные способы достижения одной и той же цели командной строки), просто использующий find
.
PS: Найти файлы в Linux и исключить конкретные каталоги, кажется, тесно связаны, но а) еще не принято и б) связано, но отличается и отличается, но в) может дать вдохновение и помочь выявить путаницу!
редактировать
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
, работает. Регулярное выражение ищет «что-нибудь, затем косую черту, затем точку, затем что-нибудь» (т. Е. Все скрытые файлы и папки, включая их подпапки) и «!» отрицает регулярное выражение
источник
Ответы:
Это печатает все файлы, которые являются потомками вашего каталога, пропуская скрытые файлы и каталоги:
Поэтому, если вы ищете файл с
some text
его именем и хотите пропустить скрытые файлы и каталоги, запустите:Объяснение:
-path
Опция запускает проверяет образец против всей строки пути.*
является подстановочным знаком,/
является разделителем каталогов,\.
является точкой (ее необходимо экранировать, чтобы избежать особого значения), и*
является еще одним подстановочным знаком.-not
означает не выбирать файлы, которые соответствуют этому тесту.Я не думаю, что
find
это достаточно умно, чтобы избежать рекурсивного поиска скрытых каталогов в предыдущей команде, поэтому, если вам нужна скорость, используйте-prune
вместо этого, например:источник
-print
в конце! Кроме того, не уверен, что-name '\.*' would be more efficient instead of
-path` (потому что путь ищет подпути, но они будут.
в этом контексте?find
означает текущий каталог:find
будет искать все файлы и каталоги в текущем каталоге. Аргумент послеpath
является регулярным выражением, где точка обычно означает «любой символ», чтобы сделать его буквальной точкой, мы должны экранировать ее обратной косой чертой. Аргумент после-name
не является регулярным выражением, но он расширяет символы подстановки как?
и*
как оболочка..
имея особое значение..
. Насколько мне известно, нужно только их экранировать:*
,?
и[]
.Это одно из немногих средств исключения точечных файлов, которое также корректно работает на BSD, Mac и Linux:
$PWD
выведите полный путь к текущему каталогу, чтобы путь не начинался с./
-name ".*" -prune
соответствует любым файлам или каталогам, которые начинаются с точки, а затем не спускаются-o -print
означает напечатать имя файла, если предыдущее выражение ничего не соответствует. Использование-print
или-print0
заставляет все другие выражения не печатать по умолчанию.источник
-o ... -print
полезно Для моего использования теперь у меня естьfind ... '!' -name . -name '.*' -prune -o ... -print
, что было удобнее, чем включение $ PWD.Исключает все скрытые каталоги и скрытые файлы в $ DIR
источник
Ответ я первоначально размещен как «редактировать» на мой первоначальный вопрос выше:
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
, работает. Регулярное выражение ищет «что-нибудь, затем косую черту, затем точку, затем что-нибудь» (т. Е. Все скрытые файлы и папки, включая их подпапки) и «!» отрицает регулярное выражениеисточник
find . \( ! -regex './\..*' \) -type f -maxdepth 1 -print
Вам не нужно использовать
find
для этого. Просто используйте globstar в самой оболочке, например:или же:
где
**/
представляет любую папку рекурсивно и*foo*
любой файл, который имеетfoo
в своем имени.По умолчанию при использовании
ls
будут печататься имена файлов, исключая скрытые файлы и каталоги.Если вы не включили глобирование, сделайте это
shopt -s globstar
.Примечание: новая опция сглаживания работает в Bash 4, zsh и аналогичных оболочках.
Пример:
источник
ls
для этого!echo **/*foo*
/
означает папку, она отделяет каталоги от имени файла.*
в основном все представляет.@ Флиммы в ответ хорош, особенно потому , что он не позволяет найти от сползания в скрытые каталоги . Я предпочитаю это упрощение:
Как правило, чтобы исключить все скрытые пути (обычные файлы, каталоги и т. Д.):
Например, используя ваш рабочий каталог в качестве начальной точки и
-name '*some text*'
в качестве выражения:В отличие от того, что предлагает ответ @ Flimm, скрытые файлы или скрытые каталоги не являются простым случаем.
-path '*/.*'
Выражение верно для любого пути (обычные файлы, каталоги и т.д.) , который имеет.
сразу после разделителя файлов,/
. Таким образом, эта строка удалит как скрытые файлы, так и каталоги.Разрешение скрытых файлов при исключении скрытых каталогов - это тот случай, когда требуется дополнительный фильтр. Это то место, которое вы бы включили
-type d
в сокращаемое выражение.Например:
В этом случае
-type d -path '*/.*'
естьtrue
только для каталогов, и поэтому только каталоги обрезают.источник
find
имеет аккуратные логические переключатели, такие как,-and
и-not
вы можете использовать их в своих интересах, чтобы найти соответствующий файл с двумя правилами, например так:Как видите,
find
используются два правила-name '*hidden_file*'
и-and \( -not -name ".*" \)
для поиска тех имен файлов, которые соответствуют обоим условиям - имя файлаhidden_file
в нем, но без начальной точки. Обратите внимание на косые черты перед скобками - они используются для определения скобок в качествеfind
аргументов, а не для определения подоболочки (что в противном случае скобки означают без косых черт)источник
Примечания:
.
: текущая папка-maxdepth 1
для поиска рекурсивно-type f
: найти файлы, а не каталоги (d
)-not -path '*/\.*'
: не вернуть.hidden_files
sed 's/^\.\///g'
: удалить предварительно добавленный./
из списка результатовисточник