|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Linux v příkazech - hledání souborůKe správě souborů nevyhnutelně patří i jejich hledání. Naučení se několika trikům může v budoucnu ušetřit spoustu času.
Hledání souborů patří mezi relativně častou činnost. Téměř veškeré hledání se v Linuxu provádí příkazy find a locate. Příkaz find - univerzální nástroj na hledání souborůfind prochází adresářovou strukturou od zadané úrovně a s každým vyhovujícím souborem provádí definovanou akci. Vyhovující je soubor tehdy, splňuje-li všechny zadané podmínky. Zaměřme se nyní na syntaxi příkazu. Ta obecně vypadá následovně.
$ find [přepínače] [cesty] [výraz]
Jak find prochází adresářovou strukturu, jsou soubory postupně zpracovávány pomocí výrazů. Výrazy určují podmínky pro vyhovující soubory i samotné akce. Právě jimi se bude zabývat značná část tohoto článku. Výraz začíná na jeden ze znaků !-(,). Není-li uveden žádný výraz, je význam stejný, jako by zde byl výraz -print, který tiskne jména souborů na standardní výstup. Pomocí -print můžeme vypsat vyhovující jména souborů v určitém adresáři. Pokud není uvedena cesta, prohledává se aktuální adresář. Konkrétnější příklad hledá v zadaném adresáři hledaný soubor a výsledky vypisuje.
$ find /zadany/adresar -name hledany_soubor -print
A následující příkaz vypisuje rekurzivně seznam všech souborů aktuálního adresáře.
$ find
Nutno poznamenat, že pro hledání souborů pouze podle názvu je často lepší použít příkaz locate, jež je k tomuto účelu přímo určený. VýrazyVýrazy se skládají z operandů a operátorů. Nyní si nejužívanější zástupce z nich představíme. Protože příkaz find má složitější syntaxi, uvedeme si k nim také větší množství příkladů. OperátoryJednotlivé operandy jsou odděleny operátory. Následující tabulka operátorů je seřazena podle priority od nejvyšší k nejnižší.
OperandyOperandy tvoří výrazy pro operátory. Můžeme je rozdělit na tři skupiny.
VolbyVolby upravují činnost příkazu a vždy vracejí pravdivou hodnotu.
Pro výpis všech souborů v aktuálním adresáři bez rekurze nastavíme úroveň zanoření na 1.
$ find . -maxdepth 1
TestyTesty jsou hlavní složkou výrazů, která se stará o filtrování souborů. Soubory, jež projdou testy, jsou dále obvykle předávány akcím. Část testů přijímá číselnou hodnotu. Čísla lze většinou psát trojím způsobem.
Pro lepší představu si ukažme konkrétní příklad. Hledáme-li soubor, který byl naposledy otevřen před 4 dny, zadáme -atime 4. Hledáme-li soubor, který byl naposledy otevřen později, než před 4 dny (před 3, 2 nebo 1 dnem), použijeme volbu -atime -4. Poslední možností je soubor otevřen před více než 4 dny (před 5, 6, 7 nebo více dny) - tedy -atime +4. Zde je přehled testů příkazu find.
Argument testu -type může být jedním z následujích znaků.
Jednotka u testu -size může nabývat hodnot b (jednotkou jsou 512 B bloky), w (dvoubajtová slova), c (B), k (KiB), M (MiB) nebo G (GiB). U testů implicitně záleží na velikosti písma. Chceme-li vyhledávat názvy s libovolnou velikostí, existují pro testy, pro něž to má smysl, i varianty na velikosti nezávislé. Začínají vždy písmenem i. Lze použít testy -iname, -ipath, -iregex a -ilname. Pro nalezení všech souborů aktuálního adresáře, které obsahují kdekoliv ve svém názvu řetězec 2006, použijeme následující příkaz.
$ find . -name '*2006*'
Chceme-li najít ve svém domovském adresáři všechny dokumenty formátu Open Document (předpokládáme, že mají vždy příponu .odf), zadáme
$ find ~ -name '*.odf'
Dále najdeme soubory v adresáři /data/2006, které byly modifikovány během posledních tří minut. Protože je to interval končící v okamžiku zadání příkazu, zadáme záporné číslo. Pokud bychom předali číslo bez znaménka, získali bychom soubory modifikované přesně před třemi minutami.
$ find /data/2006/ -mmin -3
Nyní budeme naopak hledat soubory, k nimž není zaznamenán přístup již déle než rok.
$ find ~ -atime +365 -print
Najdeme všechny soubory v aktuálním adresáři o velikosti mezi 200 a 300 KiB. Pozor však na případy, kdy má soubor alokováno více místa než skutečně používá. Pro zjištění velikosti souboru použijeme příkaz du.
$ find . -size +200k -size -300k
Najdeme rekurzivně všechny soubory v adresáři /home, jejichž vlastníkem je uživatel uzivatel.
$ find /home -user uzivatel
A nyní uděláme to samé, ale nebudeme hledat rekurzivně. Budeme hledat pouze v adresáři /home, ale už ne v jeho podadresářích. Nastavíme hloubku zanoření na 1.
$ find /home -maxdepth 1 -user uzivatel
Najdeme všechny soubory, jejichž práva mají hodnotu 700.
$ find . -perm 700
Znaménka + a - zde fungují jako operátory A a NEBO. Nyní najdeme ty soubory, které může vlastník číst, spouštět nebo do nich zapisovat.
$ find . -perm +700
A teď ty, které splňují všechny uvedené podmínky.
$ find . -perm -700
Akce
Pro podrobný výpis všech souborů, které příkaz find najde, použijeme pomocí volby -exec příkaz ls -l. Každý příkaz musíme ukončit středníkem.
$ find -name '*.odf' -exec /bin/ls -l {} \;
Pro smazání všech souborů v adresáři /tmp, které jsou starší než 30 dní, zadáme následující příkaz. Pokud bychom tento příkaz náhodou chtěli provádět periodicky, použijeme cron.
$ find /tmp/ -atime +30 -exec rm -f {} \;
Pro smazání pouze prázdných souborů v aktuálním adresáři použijeme tento příkaz.
$ find . -empty -type f -exec rm -f {} \;
Dále si necháme určit formát souboru pro každý soubor v zadaném adresáři.
$ find . -type f -exec file '{}' \;
Formátování výstupuPomocí akce -printf lze tisknout na výstup řetězec přesně podle zadaných kritérií. Struktura takového příkaz find pak vypadá následovně.
$ find [...] -printf 'formátovací řetězec'
Ve formátovacím řetězci lze kromě obvyklých escape sekvencí použít také zástupné symboly začínající znakem procenta. Některé z nich jsou uvedeny v tabulce, kompletní seznam pak je v manuálové stránce.
Znakem u symbolů %A, %C a %T může být jedna z následujících možností.
Po spuštění následujícího příkazu se zobrazí jména a čas poslední modifikace souboru podle dané šablony.
$ find . -printf 'Soubor %f naposledy změněn v %Ac\n'
Výstup lze formátovat stejně jako céčkovskou funkci printf(3), takže pro přehledný výstup ve sloupcích je možný například tento zápis.
$ find . -printf '%-20f %u (%g)\n'
A nakonec, pro naformátování všech souborů aktuálního adresáře (ty, které zastupuje hvězdička) jako SQL příkazu, zadáme toto.
$ find * -prune -printf "INSERT INTO soubory (jmeno, podadresar, velikost) VALUES ('%f', '%h', %s);\n"
Příkaz xargsPříkaz xargs provádí akci nad soubory, jejichž jména jsou této funkci předána rourou jako parametry. Perfektně se doplňuje s příkazem find. xargs je užitečný například tehdy, nestačí-li nám délka řádku shellu. Typickým příkladem užití příkazu xargs je hledání všech souborů vyhovujících vzoru, které navíc obsahují dané slovo. Následující příkaz najde v adresáři /etc všechny .conf soubory, v nichž se vyskytuje slovo cgi.
$ find /etc -name '*.conf' | xargs grep -li cgi
Poznámka - Teoreticky by mohl fungovat i tento příkaz, avšak selhal by při překročení maximální dělky příkazu v shellu.
$ grep -li cgi `find /etc -name '*.conf'`
Zpracováváme-li soubory s nestandardními jmény, jistě přijde vhod přepínač -0. Ten totiž čte argumenty, jež nejsou odděleny bílým místem, ale znakem NUL. V této souvislosti si vzpomeňme na akci -print0 příkazu find. Tato akce vytváří vstup formátovaný právě pro xargs -0. Pokud tedy xargs používáme ve spolupráci s find, vždy bychom měli oddělovat argumenty znakem NUL, abychom se vyhnuli případným nepříjemnostem. Poslední příkaz na základě této myšlenky přepíšeme.
$ find /etc -name '*.conf' -print0 | xargs -0 grep -li cgi
A nakonec napíšeme příkaz, který v aktuálním adresáři smaže soubory končící příponou .backup.
$ find . -name '*.backup' -print0 | xargs -0 /bin/rm -f
Rychlé hledání souboruPříkaz locate hledá zadaný vzor v databázi jmen souborů. Právě díky databázi je výrazně rychlejší než find. Nevýhodou je, že databáze nemusí být vždy aktuální a je třeba ji pravidelně obnovovat. Pokud zadáme příkaz locate se vzorem jako jediným argumentem, potom budou na výstup vypsány všechny soubory, jež obsahují tento vzor.
$ locate vzor
Mezi přepínače, které lze u příkazu locate použít patří tyto.
Implicitně databázi máte pravděpodobně v /var/lib/locatedb nebo /var/spool/locate/locatedb. Pokud ani na jednom z těchto umístění není, můžete ji najít pomocí locate. Databáze se obnovuje příkazem updatedb bez nebo s argumenty. Pomocí voleb --localpaths a --netpaths lze uvést konkrétní cesty, jež se mají prohledávat. --prunepaths naopak konkrétní cesty vynechává, což lze použít například na dočasně připojené oddíly. Argumentem pro tyto volby je řetězec 'cesta1 cesta2 ...'. Pro výstup do konkrétní databáze použijeme --output. Mimoto by nás možná mohl zajímat program rlocate, který zajišťuje, že je databáze jmen souborů aktualizována automaticky při změnách. Hledání otevřeného souboruNástroje lsof a fuser hledají právě otevřené soubory. Zejména lsof má velké množství všemožných podmínek. Všechny otevřené soubory zjistíme příkazem
$ lsof
Nyní najdeme pouze ty otevřené soubory, které používá aplikace s PID 5687.
$ lsof -p 5687
Pro podrobnější informace o lsof lze nahlédnout do jednoho ze článků uvedených níže. Další zdroje
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |