Начиная с (обратите внимание на подстановочные знаки до и после "немного текста")
find . -type f -name '*some text*'
как можно исключить / игнорировать все скрытые файлы и каталоги?
Я уже слишком долго гуглил, наткнулся на некоторые параметры -prune и ! (восклицательный знак), но не нашел подходящего (и экономного) примера который только что сработал.
Трубопроводный| к grep это был бы вариант, и я также приветствовал бы примеры этого; но преимущественно Меня интересует краткий однострочник (или пара отдельных однострочников, иллюстрирующих различные способы достижения одной и той же цели командной строки) просто с помощью find.
find . \( ! -regex '.*/\..*' \) -type f -name "whatever", работает. Регулярное выражение ищет "что угодно, затем косую черту, затем точку, затем что угодно" (т.е. все скрытые файлы и папки, включая их вложенные папки), а "!" отменяет регулярное выражение.
При этом будут выведены все файлы, являющиеся потомками вашего каталога, пропуская скрытые файлы и каталоги:
find . -not -path '*/\.*'
Так что, если вы ищете файл с some text в его названии, и вы хотите пропустить скрытые файлы и каталоги, запустите:
find . -not -path '*/\.*' -type f -name '*some text*'
Объяснение:
То -path опция runs проверяет шаблон на соответствие всей строке пути. * является подстановочным знаком, / является разделителем каталогов, \. является точкой (она должна быть экранирована, чтобы избежать особого значения), и * это еще один подстановочный знак. -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 . \( ! -regex '.*/\..*' \) -type f -name "whatever", работает. Регулярное выражение ищет "что угодно, затем косую черту, затем точку, затем что угодно" (т.е. все скрытые файлы и папки, включая их вложенные папки), а "!" отменяет регулярное выражение.
Используя подстановочный знак * shell для ввода всех путей из рабочего каталога, обычно подстановочный знак * не распространяется на скрытые файлы, но это можно изменить в настройках оболочки.Пример:
В отличие от того, что предполагает ответ @ Flimm, отсутствие скрытых файлов или скрытых каталогов - это простой случай. То -path '*/.*' выражение истинно для любого пути (обычных файлов, каталогов и т.д.), Который имеет . сразу после вашего разделителя файлов, /. Таким образом, эта строка удалит как скрытые файлы, так и каталоги.
Разрешение скрытых файлов при исключении скрытых каталогов - это тот случай, когда требуется дополнительный фильтр. Это то место, где вы бы включили -type d в сокращаемом выражении.
find <start-point> -type d -path '*/.*' -prune -o <expression> -print
Вместо того, чтобы указывать полный путь к каталогу, вместо этого отфильтруйте то, что имеет значение. .?* - буквальная точка, любой символ, а затем 0 или более символов.
find имеет аккуратные логические переключатели, такие как -and и -not вы можете использовать их в своих интересах, чтобы найти соответствующий файл с двумя правилами, например:
Как вы можете видеть, find использует два правила -name '*hidden_file*' и -and \( -not -name ".*" \) чтобы найти те имена файлов, которые соответствуют обоим условиям - filename с hidden_file в нем, но без ведущей точки. Обратите внимание на косые черты перед круглыми скобками - они используются для определения круглых скобок как find аргументы, скорее определяющие подоболочку (что в противном случае означает круглые скобки без косых черт)