LinuxForum.Fans
Тема

Поиск с помощью grep в скрытых файлах

Автор: kubinec 26 сообщений 5226 просмотров
#164850

Добрый день.

Подскажите, как поискать с помощью grep в скрытых файлах(файлы которые начинаются с точки)?

Если указать в качестве файла, в котором искать ./*, то ищет только в файлах без точки.

#164855
kubinec написал:
Если указать в качестве файла, в котором искать ./*, то ищет только в файлах без точки.

grep bla-bla-bla .*
не?

#164857

kubinec,
[console]
grep TEMPLATE /DIR/*
[/console]
Например:
[console]
grep -i xxkb /home/lupo/*
/home/lupo/.xxkbrc:! XXkb.app_list.wm_class_class.ignore: *clock Fvwm*
/home/lupo/.xxkbrc:! XXkb.app_list.wm_class_name.start_alt: licq
/home/lupo/.xxkbrc:! XXkb.app_list.property.ignore: _KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR
[/console]

#164863

Вот посмотрите:

[console]#pwd
/root
#ls -a
anaconda-ks.cfg
.bash_history
.bash_logout
.bash_profile
.bashrc
.cshrc
install.log
install.log.syslog
.lesshst
mail
.mc
.mplayer
.recently-used.xbel
.rnd
.tcshrc
#grep alias ./*
#grep alias ./.bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'[/console]


Fat-Zer, если ./.* то только в тех которые с точки. А мне нужно во всех. Причем в общем случае я не знаю, есть ли скрытые файлы в директории.

PS Народ. До кучи подскажите как мне скопировать- вставить команды и результат их выполнения из своей консоли, а то почти все в этом посте руками набивал.

#164864
kubinec написал:
at-Zer, если ./.* то только в тех которые с точки. А мне нужно во всех. Причем в общем случае я не знаю, есть ли скрытые файлы в директории.

[console]
grep -R TEMPLATE /DIR/*
[/console]

#164865
kubinec написал:
PS Народ. До кучи подскажите как мне скопировать- вставить команды и результат их выполнения из своей консоли, а то почти все в этом посте руками набивал.

Если нужно скопировать вывод «чистой» консоли, я использую wgetpaste — Command-line interface to various pastebins

#164870

Lupo Alberto, попробал с -R - все равно не ищет в скрытых.

#164892

kubinec,
[console]
lupo@gentoo-laptop /tmp % mkdir {test,.test} [gentoo-laptop][16:33]
lupo@gentoo-laptop /tmp % ls -al | grep test [gentoo-laptop][16:34]
drwxr-xr-x 2 lupo lupo 40 Май 25 16:34 test/
drwxr-xr-x 2 lupo lupo 40 Май 25 16:34 .test/
lupo@gentoo-laptop /tmp % echo 123 > test/file.txt [gentoo-laptop][16:35]
lupo@gentoo-laptop /tmp % echo 123 > test/.file1.txt [gentoo-laptop][16:35]
lupo@gentoo-laptop /tmp % echo 123 > .test/file2.txt [gentoo-laptop][16:36]
lupo@gentoo-laptop /tmp % echo 123 > .test/.file3.txt [gentoo-laptop][16:36]
lupo@gentoo-laptop /tmp % grep 123 * [gentoo-laptop][16:36]
lupo@gentoo-laptop /tmp % grep -R 123 * [gentoo-laptop][16:36]
test/.file1.txt:123
test/file.txt:123
.test/.file3.txt:123
.test/file2.txt:123
[/console]

#164895
kubinec написал:
t-Zer, если ./.* то только в тех которые с точки. А мне нужно во всех. Причем в общем случае я не знаю, есть ли скрытые файлы в директории.

grep bla-bla-bla .* *

#164927

kubinec,
[console]$ grep 'template' *[/console]
тут звёздочка раскрывается оболочкой. А не самой grep. Т.о. grep звёздочку НЕ ПОЛУЧАЕТ. Она получает список всех не скрытых файлов. Можете искать так:
[console]$ grep -R 'template' .[/console]
Fat-Zer, Lupo Alberto, эх...

#164929
drBatty написал:
тут звёздочка раскрывается оболочкой. А не самой grep. Т.о. grep звёздочку НЕ ПОЛУЧАЕТ. Она получает список всех не скрытых файлов. Можете искать так:

Что-то смысл от меня ускальзает... :o
Как grep можно запустить минуя оболочку? Приведите, пожалуйста, пример, когда указанная мной команда не сработает, а ваша исполнится должным образом.

#164936
Lupo Alberto написал:
Что-то смысл от меня ускальзает...

ну попробуйте сами. скрипт:
[console]ksu@ksu:~/test$ mkdir t7
ksu@ksu:~/test$ cd t7
ksu@ksu:~/test/t7$ touch f1 f2 .f3 .f5
ksu@ksu:~/test/t7$ ls -la
итого 8
drwxr-xr-x 2 ksu users 4096 Май 25 19:26 ./
drwxr-xr-x 7 ksu users 4096 Май 25 19:26 ../
-rw-r--r-- 1 ksu users 0 Май 25 19:26 .f3
-rw-r--r-- 1 ksu users 0 Май 25 19:26 .f5
-rw-r--r-- 1 ksu users 0 Май 25 19:26 f1
-rw-r--r-- 1 ksu users 0 Май 25 19:26 f2
ksu@ksu:~/test/t7$ cat ../aster.sh
#!/bin/bash

echo "Этот скрипт получил такие параметры:"

count=0
while [ "$1" ]
do
(( count++ ))
echo "$count '$1'"
shift
done
ksu@ksu:~/test/t7$ ../aster.sh *
Этот скрипт получил такие параметры:
1 'f1'
2 'f2'
ksu@ksu:~/test/t7$ ../aster.sh .*
Этот скрипт получил такие параметры:
1 '.'
2 '..'
3 '.f3'
4 '.f5'
ksu@ksu:~/test/t7$ ../aster.sh .* *
Этот скрипт получил такие параметры:
1 '.'
2 '..'
3 '.f3'
4 '.f5'
5 'f1'
6 'f2'
ksu@ksu:~/test/t7$
[/console]
Самое глупое происходит тогда, когда файлов нет вообще:
[console]ksu@ksu:~/test/t7$ rm -vf .* *
rm: невозможно удалить «.»: Это каталог
rm: невозможно удалить «..»: Это каталог
удалён «.f3»
удалён «.f5»
удалён «f1»
удалён «f2»
ksu@ksu:~/test/t7$ ../aster.sh .* *
Этот скрипт получил такие параметры:
1 '.'
2 '..'
3 '*'
ksu@ksu:~/test/t7$ ../aster.sh *
Этот скрипт получил такие параметры:
1 '*'
[/console]
тут мы видим, что если файлов нет вообще, то звёздочка не раскрывается оболочкой, а прямиком передаётся внутрь скрипта. А вот как реагирует эта ваша grep:
[console]ksu@ksu:~/test/t7$ grep 'template' *
grep: *: Нет такого файла или каталога
ksu@ksu:~/test/t7$ grep 'template' .* *
grep: *: Нет такого файла или каталога
ksu@ksu:~/test/t7$
[/console]
видите как интересно - нету файла `*'
И скажите спасибо, что у grep хватило ума не полезть наверх, в файл `..'. Сами понимаете, насколько это опасно (в лучшем случае скрипт тупо зависнет, в худшем перепортит ВСЁ). Ну grep просто парсит файлы, потому она-бы просто зависла, парся ВЕСЬ корень. :(

#164937
drBatty написал:
$ grep -R 'template' .

а если не надо искать в поддиректориях?

Lupo Alberto написал:
Как grep можно запустить минуя оболочку? Приведите, пожалуйста, пример, когда указанная мной команда не сработает, а ваша исполнится должным образом.

пример не в тему, но exec() из сишной программы, или НЁХ-шелл не знающий как экспандить звёздочку...

ЗЫ: . короче, чем "$PWD/*" и вывод легче, если путь длинный...

#164938
Lupo Alberto написал:
Как grep можно запустить минуя оболочку?

цимес в том, что запускается не
[console]grep '*'[/console]
а
[console]grep f1 f2[/console]

Lupo Alberto написал:
Приведите, пожалуйста, пример, когда указанная мной команда не сработает

команда
[console]rm .*[/console]
на самом деле будет выполнена так:
[console]rm '.' '..' '.f3' '.f4'[/console]
А теперь скажите: хватит у вашей rm мозгов, НЕ удалить каталог `..' ? :O
Проверять - страшновато... :o

#164939

Возможно, такое поведение зависит от оболочки.
[console]
lupo@gentoo-laptop genkernel % cd /tmp [gentoo-laptop][18:36]
lupo@gentoo-laptop /tmp % grep -R 123 * [gentoo-laptop][18:36]
test/.file1.txt:123
test/file.txt:123
.test/.file3.txt:123
.test/file2.txt:123
lupo@gentoo-laptop /tmp % rm -Rf test [gentoo-laptop][18:36]
lupo@gentoo-laptop /tmp % rm -Rf .test [gentoo-laptop][18:37]
lupo@gentoo-laptop /tmp % grep -R 123 * [gentoo-laptop][18:37]
lupo@gentoo-laptop /tmp %
[/console]
В любом случае, спасибо за информацию!

#164940
Fat-Zer написал:
а если не надо искать в поддиректориях?

[console]$ find . -maxdepth 1 type f -exec grep 'template' {} /dev/null \;[/console]
Обратите внимание на пустой файл вторым параметром - grep пишет имя файла только если файлов >1.

Fat-Zer написал:
пример не в тему, но exec() из сишной программы, или НЁХ-шелл не знающий как экспандить звёздочку...

...и в баше поведение * и ** можно настроить.

Fat-Zer написал:
ЗЫ: . короче, чем "$PWD/*" и вывод легче, если путь длинный...

поймите: $PWD/* НЕ передаётся команде. Это не тоже самое, что "точка".
Кстати: $PWD и "точка" - суть разные каталоги (хотя там одно и то же). На самом деле, "точка", это второе имя $PWD (ака хард-линк).

#164941
drBatty написал:
А теперь скажите: хватит у вашей rm мозгов, НЕ удалить каталог `..' ? ohmy

У меня хватит wink
[console]lupo@gentoo-laptop ~ % grep 'alias rm' .zshrc [gentoo-laptop][18:44]
alias rm='nocorrect rm -i'[/console]

#164942

может сразу в разговорную перейдём?

drBatty написал:
А теперь скажите: хватит у вашей rm мозгов, НЕ удалить каталог `..' ?
Проверять - страшновато...

думай перед тем как печатать и ещё раз перед тем как нажимать ентер

drBatty написал:
цимес в том, что запускается не

единственная проблема тут это если в каталоге слишком много файлов... тогда нужно буде xargs юзуть...

#164943
Lupo Alberto написал:
Возможно, такое поведение зависит от оболочки.

безусловно. Ещё и от окружения. Звёздочка от рута, звёздочка по расписанию, и звёздочка в чистом терминале могут работать четырьмя разными способами.

В zsh всё проще и естественнее, потому меня с моим башем на UFO ругают :)
ИМХО они просто неосиляторы wink

#164944
drBatty написал:
поймите: $PWD/* НЕ передаётся команде. Это не тоже самое, что "точка".
Кстати: $PWD и "точка" - суть разные каталоги (хотя там одно и то же). На самом деле, "точка", это второе имя $PWD (ака хард-линк).

я это знаю...

drBatty написал:
$ find . -maxdepth 1 type f -exec grep 'template' {} /dev/null \;

grep не будет показывать в каком файле найдена строка...

ещё вариант: grep qwe ${ls -A} проблемма с файлами со всякой хренью в названии...

Войдите или зарегистрируйтесь, чтобы ответить.