Як я можу grep приховані файли?


96

Я шукаю в сховищі Git і хотів би включити .gitпапку.

grep не включає цю папку, якщо я запускаю

grep -r search *

Що було б командою grep для включення цієї папки?

Відповіді:


135

Будь ласка, зверніться до рішення в кінці цього допису як кращої альтернативи тому, що ви робите.

Ви можете явно включити приховані файли (каталог - це також файл).

grep -r search * .*

*Відповідатиме усім файлам , крім прихованих з них і .*буде відповідати тільки прихованих файлів. Однак це не вдасться, якщо в даному каталозі відсутні або не приховані файли, або прихованих файлів. Звичайно, ви можете явно додати .gitзамість .*.

Однак, якщо ви просто хочете шукати в даному каталозі, зробіть це так:

grep -r search .

Параметр .буде відповідати поточному шляху, який включатиме як не приховані, так і приховані файли.


1
Перший підхід (пошук grep -r *. *) Спрацював для мене. Другий підхід (пошук grep -r.) Не знайшов рядка. Я знайшов подібні результати, опускаючи "-r" та шукаючи лише каталог верхнього рівня. Я використовую GNU grep 2.6.3.
Алан

@ Алан: Це дивно. Я регулярно цим користуюся. Ви пробували це в тому ж каталозі?
bitmask

27
using .*буде включати батьківський каталог (тому що ..збіги)
sehe

1
Чи безпечно узагальнювати це рішення, оскільки поведінка може змінюватися в залежності від оболонок?
астлетрон

6
для першої версії слід додати --exclude-dir = .., щоб уникнути пошуку в батьківських папках
user762353

12

Я щойно зіткнувся з цією проблемою, і на основі відповіді @ bitmask, ось моя проста модифікація, щоб уникнути проблеми, на яку вказав @sehe:

grep -r search_string * .[^.]*

я не отримую жодних результатів, використовуючи це: sudo grep -r ANDROID_HOME * .[^.]*що я тут роблю не так?
messerbill

@messerbill, де ти здійснюєш пошук?
insaner

3

Можливо, ви віддасте перевагу поєднати "grep" з командою "find" для повного рішення, наприклад:

find . -exec grep -Hn search {} \;

Ця команда буде шукати в прихованих файлах або каталогах рядок "пошук" та перераховувати будь-які файли, що збігаються з таким вихідним форматом:

Шлях до файлу: Номер рядка: рядок із збігом

./foo/bar:42:search line
./foo/.bar:42:search line
./.foo/bar:42:search line
./.foo/.bar:42:search line

2

Можливо, ви захочете скористатися цим підходом, припускаючи, що ви шукаєте в поточному каталозі (інакше замініть. На потрібний каталог):

find . -type f | xargs grep search

або якщо ви просто хочете здійснити пошук на найвищому рівні (що швидше перевірити, якщо ви їх пробуєте):

find . -type f -maxdepth 1 | xargs grep search

ОНОВЛЕННЯ: Я модифікував приклади у відповідь на коментарі Скотта. Я також додав "-тип f".


1
(1)  ~- це домашній каталог користувача. Питання стосувалося не домашнього каталогу користувача, тому у відповіді не слід згадувати  ~. (2) У  findкоманді -name '*'- це відсутність (тобто вона не служить жодній меті).
Скотт

1

Щоб здійснити пошук ТІЛЬКИ у всіх прихованих файлах та каталогах з вашого поточного місцезнаходження:

find . -name ".*" -exec grep -rs search {} \;

ТІЛЬКИ всі приховані файли:

find . -name ".*" -type f -exec grep -s search {} \;

ТІЛЬКИ всі приховані каталоги:

find . -name ".*" -type d -exec grep -rs search {} \;

1

Усі інші відповіді кращі. Це легко запам'ятати:

find . -type f | xargs grep search

Він знаходить лише файли (у тому числі приховані) і greps кожен файл.


0

Щоб знайти лише в певній папці, ви можете використовувати:

ls -al | grep " \."

Це дуже проста команда для списку та конвеєра для grep.


0

На додаток до пропозиції Тайлера, ось команда для рекурсивного grep-файлу всіх файлів і папок, включаючи приховані файли

find . -name "*.*" -exec grep -li 'search' {} \;

0

Для запобігання узгодження .і ..що не приховані файли, ви можете використовувати grepз ls -Aяк в цьому прикладі:

ls -A | grep "^\."

^\. стверджує, що першим символом повинен бути .

-AАбо --almost-allваріант виключає результати .і ..так , що тільки приховані файли і каталоги збігаються.


0

Ви також можете шукати певні типи прихованих файлів, наприклад, для прихованих файлів каталогів:

grep -r --include=*.directory "search-string"

Це може працювати краще, ніж деякі інші варіанти. Інші варіанти, які працювали, можуть бути надто повільними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.