Find parancs alapok

Kövessük a változásokat!
Find parancs

Find parancs használata Linux alatt nagyon egyszerű és hatékony. Érdemes az alapokkal megismerkedni, és ha kell, használni is. A find parancs egy kereső parancs, amivel fájl tulajdonosának, fájlméretének, fájlmódosítási dátumának, fájlnevének stb. megadásával keresni. Gyakorlatilag bármire kereshetünk, ami egy fájlhoz tartozik.

Vannak grafikusak is…

Igen! Sok jó és használható grafikus keresőnk van, illetve a legtöbb fájlkezelő is rendelkezik valamiféle kereső funkcióval. Ezeknél egy közös probléma van: nincsenek felkészítve a megtalált fájlokkal való akármilyen műveletre. Itt az akármilyen szón van a hangsúly, hiszen az esetek egy részében nem csak megtalálni akarunk valamit, hanem azzal tennivalónk is van. Amíg a cél egy másolás, törlés stb. addig nagyon jó a krusader keresési funkciója, majd egy virtuális könyvtár létrehozása a találatokkal, de ez is korlátos megoldás. A parancssorból sok esetben kényelmesebb, hatékonyabb a keresés, majd a találatok összefűzése egy másik műveletre. Erre kiválóan alkalmas a find parancs.

A find parancs jellemzően telepítve van, és használatra kész a Linux disztribúciókban.

A find parancs alap használata

A find parancs szintaxisa egyszerű. Először megadjuk a keresni kívánt utat, majd különböző lehetőségeket biztosítunk.

find PATH OPTIONS

Bár önmagában a szintaxis egyszerű, de minden elemére helyezzünk nagy hangsúlyt, mert ha alapszinten megtanuljuk a használatát, akkor nagyon gyorsan és hatékonyan kereshetünk, majd végezhetünk el műveleteket a találatokkal.

Az alap művelet jellemzően egy fájl keresése a megadott könyvtárban. Ezt használjuk a legtöbbet.

A fájlok megkeresésének egyszerű és gyors módja a nevük használata. Az aktuális könyvtárban keresünk egy minta.txt nevű fájlt. A find parancs -name opcióját fogjuk használni, és a pont azt jelenti, hogy az aktuális munkakönyvtárban akarunk keresni.

find . -name minta.txt

Ha pedig egy másik könyvtárban akarsz keresni, akkor annak az elérési útvonalt kell megadni:

find /home -name minta.txt

Alapértelmezés szerint a find parancs megkülönbözteti a kis- és nagybetűket. Ha a keresésnél figyelmen kívül szeretnéd hagyni a kis- és nagybetűket, akkor -iname kapcsoló lesz a megfelelő. Ebben a példában a minta.txt keressük meg kis- és nagybetűk nélkül a teljes fájlrendszerben.

find / -iname minta.txt

Hasznos, ha nem tudod, hogy Minta.txt vagy minta.txt a keresés célja konkrétan. Illetve gyakran keresünk egy-egy program fájljaira is, aminél bizonytalan a kinézet. Sok program összevissza használja a kis és nagybetűs megnevezést, ami alapesetben zavaró lehet.

A find parancs skálázása

Egy fájl megkeresése nagyszerű dolog, ha nem találod és gyorsan kell. De az egyik erőssége a normális keresőprogramoknak a skálázhatóság, ahol már nem az „elhánytam a kedvenc fájlomat, és keresse meg valaki” a téma, hanem komolyabban megadott elvek szerinti, esetlegesen tömeges keresés.

Pár, valóban csak pár példát hozok, mert a man find és egyén helpek olvasása után ráébredsz, hogy a lehetőségek végtelenek. Nincs nagy értelme a man find idemásolása, példákkal…

Típus szerinti keresés. A find parancs képes típus szerint is keresni, a példában a -d, azaz könyvtárnevekre keresünk rá.

find / -type d -name bash

Ahol az összes könyvtárat kilistázza melynek a neve bash.

Tipp: nézd meg a -type kapcsoló lehetséges variációit! Nagyon jól beskálázható a keresés ezzel is.

Azt nem is kell kiemelni, hiszen természetes: a kapcsolók együtt is használhatók. Így a fenti példát egészítsd ki azzal a kapcsolóval, amit már ismersz és a keresésbe beleveszi a Bash könyvtárakat is.

Gyakori feladat egy adott kiterjesztés keresése. A find parancs a regexperteket is értelmezi, így maga a felépítés nem lesz meglepő.

find . -name '*.txt'

Előfordulhat, hogy a shell-ek nem egyformán értelmezik az idézőjeleket, így kicsit próbálkozni kell, ha nem működik így. Az esetek nagyon-nagy részében nem lesz gond, de jó ha első gondolatod az idéző- illetve a zárójelek terén lesz egy hiba esetén.

Itt is halmozható a keresés:

find . -type f ( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" )

A doc, txt és pdf fájlok lesznek kiválogatva.

Bár nem egy tipikus felhasználási módja a find programnak, de használható a jogosultságok szerinti keresésre. Egy valóban hasznos megoldás, ha kilistázza a 777, azaz mindenki által írható, olvasható és futtatható fájlokat. Nem feltétlen kell egy többfelhasználós rendszerben folyamatosan minden fájlnak 777-esnek lenni. Bár sok esetben kényelmes, ha egy-egy könyvtárban minden lévő állományok mindenki számára elérhetőek, de folyamatosan – ha nem kell valami miatt – ezt kerüljük. A gyors kereséshez használjuk a

find /home/laci -type f -perm 0777

Így már képbe kerülünk a megosztott fájlokkal. A kimenetet természetesen átirányíthatjuk egy szöveges fájlba is: find /home/laci -type f -perm 0777 > 777.txt. Ez természetes, nem is érdemes szót vesztegetni rá!

Sok esetben az üres fájlokat szeretnénk megkeresni, amiket a programok létrehoznak, de nem törlik le a munka után:

find / -type f -empty

Hasonlóképp kellemes funkció az időkódok szerinti keresés. Bár itt is nagyon nagy a lehetőség én csak egy példát hozok:

find /home/ -cmin -60

Az elmúlt egy órában létrehozott fájlokat listázza ki. Szuper, ha telepítesz tesztre egy programot, majd leszeded, mert nem tetszik. Így az összes ottmaradt könyvtárat, fájlt stb. megtalálod.

Remélem már átlátjátok, hogy a keresés nem csak sima fájlnévre történhet a find program alapfunkcióit használva, hanem sokkal tágabb értelemben is kereshetünk.

Find parancs eredményeinek felhasználása

Név szerinti keresés nem egy túl nagy feladat, sok egyéb program és grafikus felületű eszköz is szuperül megoldja. A find parancs nagy előnye. hogy egyéb feltételeket is keres. Jellemzően ez az a határ amit a grafikus programok is tudnak.

Kellemes lehetőség, hogy komolyabb szerkezet nélkül is tovább tudja adni az eredményt további feldolgozásra. Itt már nem az a cél, hogy egy kritériumnak megfelelő fájlokat megtaláljon, majd én egyesével tegyek velük valamit, hanem a kötegelt, gyors feldolgozás.

Itt is csak a felszínt kapargatom, mert a lehetőségeknek pontosan a tudásunk szab határt, nem a program. Aki megérti, és kipróbálja ezeket annál már nem lesz probléma komolyabb, összetettebb tevékenység sem.

A legegyszerűbb, és napi szinten előforduló tevékenység a törlés (vagy egyéb fájlművelet) a találati eredménnyel.

find . -type f -name "*.old" -exec rm -f {} \;

A felépítés egyszerű: a jelenlegi könyvtárban (.) a fájlokat (-type f), amiknek a kiterjesztése .old és a nemük bármi lehet (-name “*.old”) keresd meg. Ezt a részt végzi el a find parancs. Majd az -exec kapcsolóval összekötjük egy másik, jelenleg az rm paranccsal, aminek a paramétere jelenleg a {} ami a find parancs által küldött fájlneveket, azaz a find kimenetét szimbolizálja. Így szép sorban minden találatot letöröl az rm, amit a find küld neki.

Igen, valóban! Ezt egy nem túl bonyolult szkripttel is meg lehet oldani, de ez így sokkal egyszerűbb.

find ./ -type f -name "*.txt" -exec grep 'xmonad' {} \;

Keressen az összes txt fájlban a jelenlegi könyvtárban az xmonad szóra.

find ./ -name "*.sh" -type f -exec chmod 755 {} \;

Beállítja az összes szkript jogosultságát.

find -maxdepth 1 -type d -not -name . -exec tar --use-compress-program=pigz -cf '{}'.tar.gz '{}' \;

Az összes alkönyvtárat ami ebben a könyvtárban van összetömöríti a megadott tömörítéssel, és az alkönyvtárneve.tar.gz lesz a fájl neve. Itt érdemes kizárni a -not -name . sorral a szülőkönyvtárat, aminek a tömörítésére nincs most szükség. Nézd meg, hogy egy könyvtárban kiadott find . -type d parancs a „valódi” könyvtárakon kívül egy . nevűt is kilistáz!

Illetve megadni azt a könyvtármélységet, amiben a -d azaz a könyvtárakat keresse. Ha nem korlátozzuk le ezt, akkor nem feltétlen kapjuk meg a várt eredményt, hanem az al-al könyvtárakra is kiterjed a keresés a find parancsnál. Próbál kilistáztatni így

find -maxdepth 1 -type d

és így is:

find -type d

Rögvest látható az eltérés!

find . -type f -exec "*.old" ls -s {} \; | sort -n -r | head -3

find . -type f -exec "*.old" ls -s {} \; | sort -n | head -3

A három legnagyobb, illetve legkisebb .old fájl kikeresése. A példa nem egy túl hasznos, inkább arra mutat rá, hogy a find eredményét továbbadhatjuk az egy másik programnak (ls) majd az így kapott eredményt is lehet csővezetékezni, akár a végtelenig. Ha komolyabb, hosszabb pipe sort raksz össze ez a kis program jól jöhet.

Réges-régi fájlok átmozgatása egy adott könyvtárba:

find . -type f -name '*.txt' -mtime +20 -exec mv {} /backup1/ \;

De törölheted is:

find . -type f -name '*.bak' -mtime +20 -exec rm {} \;

Igen, tudom! Van a find parancsnak egy -delete kapcsolója is. Ami végleges törlést végez, és nincs lehetőség pld. az rm -i megadására, így jobban járok, ha az erre szakosodott parancsot kötöm be a sorba. Azt is tudom, hogy ez lassabb, sokkal lassabb, mint a -delete kapcsoló!

touch {0..10000}.txt

time find ./ -type f -name “*.txt” -exec rm {} \;

user=3,85s system=1,43s cpu=99% total=5,

touch {0..10000}.txt

time find ./ -type f -name ‘*.txt’ -delete

user=0,01s system=0,05s cpu=97% total=0,060

Nem pici eltérés! Ha már nagyon magabiztos leszel, akkor ezt is használhatod. A szekvenciális fájlkészítésről itt olvashatsz.

Érdemes megnézni a sima rm *.txt paranccsal is. 🙂

Tesztelésnél, próbálgatásnál mindig ellenőrizd a találati listát, és csak azután add megg a következő részt. Ami nem túl nagy feladat, az előbbi példa alapján:

find . -type f -name '*.bak' -mtime +20

megnézed, hogy azt találta meg, amit akartál, majd azután a

find . -type f -name '*.bak' -mtime +20 -exec rm {} \;

is futhat.

find ./ -type f -exec sed -i 's/alma/körte/g' {} \;

A könyvtárban lévő összes fájlban kicseréli az alma karaktersort körte karaktersorra.

Remélem meghoztam a kedvet a find parancs megismeréséhez!

Related Posts