it-swarm-eu.dev

Jak hledat text v celém systému souborů?

Za předpokladu, že by měl být použit nástroj grep, rád bych hledal textový řetězec „800x600“ v celém systému souborů.

Zkusil jsem:

grep -r 800x600 /

ale nefunguje to.

Věřím, že můj příkaz by měl udělat, je rekurzivní grep ve všech souborech/složkách v kořenovém adresáři pro text „800x600“ a seznam výsledků vyhledávání.

Co dělám špatně?

56
Level1Coder

Normálně používám tento styl příkazu ke spuštění grep na několika souborech:

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

Ve skutečnosti to dělá seznam všech souborů v systému a poté pro každý soubor spusťte grep s danými argumenty a názvem každého souboru.

Argument -xdev Říká, že musí ignorovat ostatní souborové systémy - to je dobré pro vyhýbání se speciálním souborovým systémům, jako je /proc. Bude však také ignorovat normální souborové systémy - takže pokud je například vaše/domovská složka na jiném oddílu, nebude prohledáván - budete muset říct find / /home -xdev ....

-type f Znamená hledat pouze soubory, takže adresáře, zařízení a další speciální soubory jsou ignorovány (stále se bude opakovat do adresářů a vykonávat grep v souborech uvnitř - to prostě nebude vykonávat grep v samotném adresáři, který by stejně nefungoval). A volba -H Na grep říká, že má vždy vytisknout název souboru na jeho výstupu.

find přijímá nejrůznější možnosti filtrování seznamu souborů. Například -name '*.txt' Zpracovává pouze soubory končící na .txt. -size -2M Znamená soubory, které jsou menší než 2 megabajty. -mtime -5 Znamená soubory upravené za posledních pět dní. Spojte je společně s -a pro a a -o pro nebo a pomocí závorek '('')' Seskupte výrazy (v uvozovkách zabránit Shell v jejich interpretaci). Například:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

Podívejte se na man find A zobrazí se úplný seznam možných filtrů.

68
Richard Downer

Normálně byste v systému nechtěli hledat VŠE vše. Linux používá uzly souborů pro všechno, takže některé „soubory“ nejsou věci, které byste chtěli prohledávat. Například /dev/sda je fyzické blokovací zařízení pro váš první pevný disk. Pravděpodobně budete chtít prohledat připojené systémy souborů, nikoli zařízení diskových zařízení. Také existuje /dev/random které vyplivuje náhodná data při každém čtení. Hledání, které nedává moc smysl. The /proc Systém souborů je ve vašem případě také problematický.

Doporučil bych jednu ze dvou věcí.

  1. Nehledejte kořen, pouze prohledávejte místa, která by mohla být užitečná. Vyhledávání /home nebo /usr nebo /etc odděleně. Informace, které hledáte, jsou pravděpodobně určitého typu, takže je pravděpodobné, že budou v určité složce. Konfigurační nastavení by mělo být v /etc. Vaše soubory osobních údajů by měly být v /home. Omezením vyhledávání na hlavní oblast, jako je tato, se výrazně sníží vaše problémy s rekurzivním greps.

  2. Vyloučit problematické oblasti pomocí --exclude-dir a soubor věcí, o kterých víte, že to nepotřebujete:
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

A konečně není neobvyklé narazit na několik chyb „zamítnutých povolení“, když děláte velký rekurzivní grep. Při běžném používání existují soubory, které váš uživatel nemusí přečíst. Pokud se jedná pouze o několik lichých souborů a ne o věci, jako je surové zařízení pro pevné disky nebo celý systém souborů proc, je v pořádku chyby ignorovat. Ve skutečnosti to můžete udělat na příkazovém řádku zasláním všech chyb do nikdy nikdy přistát:

grep -r search_string /path 2> /dev/null
15
Caleb

Pro jednoduchost bych navrhl ack-grep . Odkaz ukazuje mnoho případů, když ack-grep je lepší volba.

Po instalaci použijte:

ack-grep pattern /
3
bbaja42

Dalším způsobem, jak se na to dívat, je tento způsob:

grep -r /* | grep "800x600"
2
maniat1k

* pak dostanu/proc/sysrq-trigger: Chyba vstupu/výstupu

Váš příkaz pracuje, tato chyba se zobrazuje, protože se pokoušíte vyhledat spuštěné procesy pro řetězec.

Doporučuji vyloučit systémové adresáře pomocí

grep -exclude-dir = {proc, sys} "800x600" /

0
Koffee