пятница, 5 июня 2009 г.

Долго мы искали ....

Есть в *nix системах замечательное понятие скрытых файлов и папок, это все те, имена, которых начинаются с . (точки). От кого же они скрыты? От lsи ВСЕ! И как же быть если и grep и find их видит? И так я хочу что бы по-честному grep  не искал в скрытых файлах и в файлах, которые находтся в скрытых папках. Зачем мне это нужно: а есть у меня прокет -  много-много папочек, целое деревце, и проект я забирала из svn и в каждой папочке имею подпапочку с именем .svn. Когда я ищу что-то по проекту, grep проходит и через них. таким образом дублирую как бы результать поиска - не удобно. особенно, если много. Кроме того у меня grep версии 2.5.чего-то там и у него нет ключа -exclude-dir.

И так сама я решение не нашла, хотя былда близка мне помогли :) , но что бы его не забыть ВОТ ОНО!

find где_искать -type f -not -path '*/.*' -exec grep -Hn что_искать '{}' \;

Но! у решения есть один недостаток файлы в коре "где_искать" он не обрабатывает. правда мне не критично. :)

-Hn - это что бы показывало путь к файлу и номер строки - нужно если искать в emacs.

Кто подскажет еще изящные способы решения проблемы :) буду благодарна.

«Долго мы искали, долго мы искали,
(обошли деревни, сёла, города)
мальчика, который любит чистить зубы
и девочку, которая не плачет никогда…»

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

(С) Олег Супруненко

7 комментариев:

  1. --exclude=FILE_PATTERN пропускать файлы и директории, совпадающие с FILE_PATTERN
    --exclude-from=FILE пропускать файлы, совпадающие с любым из шаблонов из файла FILE
    --exclude-dir=PATTERN директории, совпадающие с PATTERN которые были пропущены.

    Все три ключа отсутствуют? В моём есть:
    evgeny@evgeny-desktop:~$ grep --version
    GNU grep 2.5.3

    ОтветитьУдалить
  2. а скрытые файлы скрыты только от человека. не только ls но и всякие KDE/GNOME их могут не показывать. впрочем я всегда влючаю показывать. Обычно мне нужно как раз куда-то в скрытое место. :)

    Да, вот тебе второе решение. Так сказать влоб:
    grep -R some my/path/|grep -v /.svn/

    ОтветитьУдалить
  3. Хотелось универсальный для всех скрытых файлов (причем и в корне тоже, чего я так и не добиалсь :( ) Кроме того, мне кажется при обработки больших объемов данных при этом варианте будут сильные тормоза. разве нет ?
    так же можно думаю найти еще и дургие побочные действия такого подхода.
    Хочу найти лучше и проще вариант. пока не нашла

    ОтветитьУдалить
  4. про корень не понял. У меня ищет везде где скажешь.
    А find самый правильный вариант. особенно когда не хватает мощи других утилит. Ты вообще покажи версии своих, что-то они у тебя все странные какие-то.
    evgeny@evgeny-desktop:~$ find --version
    find (GNU findutils) 4.4.0

    ОтветитьУдалить
  5. find 4.1.7.
    Версии увы от меня не зависят :(

    ОтветитьУдалить
  6. Хоть GNU?

    2001-05-20 Kevin Dalley /kevin@seti.org/
    * Version 4.1.7
    Круглую дату пропустили: 8 лет! :)

    Сейчас актуальная 4.5.4 Я changelog почитал, изменений не много, в основном с локализацией, оптимизацией, и прочими мелочами. Но всё равно обидно на такой устаревшей версии работать. И помочь сложно, если поведение нюансами отличается. Хотя утилита известна со времён первых юниксов. То есть с начала 7х. И всё что нужно всегда ей искали. Ты ещё раз опиши, что должна делать команда, особенно про корень не понял. Возможно ты про . говоришь, а она подпадает под маску .* Хотя у меня всё и везде ищется и так...

    ОтветитьУдалить
  7. 10 советов по использованию утилиты GNU Find

    http://rus-linux.net/nlib.php?name=/MyLDP/consol/find.html

    ОтветитьУдалить

Моя фотография
http://aal.flamber.ru - мой фотоальбом