[törölve]
Na az oktális jogosultságokkal való listázásból kinőtte magát ez a szép prograny. Korábban írtam egy hasonlót, de nagyon randa volt hogy az ls kimenetét lemezre irandó állományba menti ki, majd azt visszaolvassa, s jön egy undorító szövegfeldolgozás. E mostani nem követ el ilyen illetlenséget, és többet is tud annál. Aztán, ez rendesen C++ nyelven van írva, full objektumorientált, stb. Hogy mit tud? Ideírom a helpjének a kimenetét. Már amiatt is, mert ötleteket várok a továbbfejlesztésre. A progim már képes & kapcsolatot létesíteni két tartalomjegyzék közt, azaz kilistázza azon tételeket amiket egyezőnek talál. Hogy mikor tekint két bejegyzést egyezőnek, természetesen a legapróbb részletekig szabályozható-paraméterezhető. Itt már hajnal 2 óra van, azaz ennek párja, hogy a különbségeket listázza ki, "holnapra" marad... az azt hiszem a "-" műveletre lesz téve. Ugye kivonja az egyik könyvtárból a másikat. Operator overloading rulez! De remélem míg alszom, tele lesz e fórum hasznos ötletekkel meg 6letekkel, hogy mit tudjon még. Mivel még fejlesztem, nem tettem fel sehova a forráskódot, minek amikor úgyse sokakat érdekel erre a parancssor, de aki kéri, csak küldjön nekem email, s elküldöm neki csatolva a forrást. E programot készítette: Viola Zoltán ( violazoli@gmail.com ) A program neve: "hacker_ls" Licenc: GPL Mit csinál: "full-extra-de-luxe" könyvtárlistázó rutin például kiírja a fájlok jogosultságát 4 oktális számjeggyel, eképp: 0777 Rendesen lekezeli az USERID, GROUPID és STICKY biteket is. (Ezek a kilistázott 4 karakteres oktális szám legnagyobb helyiértékű azaz baloldali számjegyét alkotják). Így kell lefordítani: g++ -funsigned-char -funsigned-bitfields -Wall -Wno-long-long -Wunused -Wextra -pedantic hacker_ls.cpp -o hacker_ls Használat: hacker_ls — ez az aktuális könyvtárban listáz, alapbeállításokkal hacker_ls -? — kiírja ezt a helpet hacker_ls -h — kiírja ezt a helpet A program legáltalánosabb használata: hacker_ls [kapcsolóstring] [formátumstring] [listastring] [könyvtárneve] [másodikkönyvtárneve] [relációstring] Ez azt jelenti, hogy egyetlen paramétert se kötelező megadni (ezt jelzi az, hogy szögletes zárójelekben vannak) A paraméterek sorrendje tetszőleges. A progi onnan tudja, melyik paraméternek mi a szerepe, s megadtuk-e egyáltalán, hogy hány mínuszjellel kezdődik a paraméter. A kapcsolóstring balelső karaktere kötelezően mindig egy mínusz jel ('-'), és a balról a második karaktere soha nem mínuszjel, a formátumstringnek ellenben mind a két baloldali első karaktere mínuszjel, de a harmadik sosem. A listastringnek az első 3 karaktere mínuszjel. Az első könyvtár neve ellenben soha nem kezdődhet mínuszjellel. A második könyvtár neve 4 mínuszjellel kell kezdődjék, a relációstringé pedig 5-tel. A formátumstring határozza meg, milyen adatokat írjon ki a kilistázandó állományokról, milyen sorrendben és formátumban. A kapcsolóstring segítségével mindenféle módon befolyásolhatjuk a munkáját. Csak egy kapocsolóstringet, egy formátumstringet, egy relációstringet és egy listastringet adhatunk meg. Amelyiket nem adjuk meg, ott az alapértelmezett beállítás lép életbe. Ezek a következők: Könyvtárneve: "." Második könyvtárneve: "." Kapcsolóstring: "-o" Formátumstring: "--%d %H %3l %15T %15G %20m %30n %> %L" Listastring: "---DLRBCFSM" Relációstring: "nLlm" A kapcsolókból akármennyit meg lehet adni, egyetlen "-" jel után, pld: -p01 Egy példa a használatra: hacker_ls ./teszt ----/home/user/proba "-&o0V" "--%20m %30n %> %L" -----N ---LR A listastring a D,L,R,B,C,F,S,M betűket tartalmazhatja tetszőleges sorrendben, s ez azt jelenti, hogy az ezen betűk előfordulási sorrendjében listázza ki a betűk által jelképezett típusú tartalomjegyzék-bejegyzéseket. A betűk jelentése: D: altartalomjegyzék, R: közönséges(reguláris) fájl, L: szimbolikus link, B: blokkdevice, C: karakteres eszköz, S: socket, F: fifo, M: minden egyéb Ha más betűt talál a listastringben, akkor mindent kilistáz. Például a ---DLR listastring azt mondja, hogy előbb listázza ki az összes alkönyvtárat, majd az összes szimbolikus linket, majd az összes reguláris fájlt. Természetesen mindet ABC sorrendben listázza ki. A kapcsolók jelentése: p = listázza a rejtett tartalomjegyzékeket is (amiknek a neve ponttal kezdődik). (kis p) P = Az állományok nevét a PATH-tal, azaz az elérési útvonallal együtt listázza ki. (nagy P) Ez nagyon hasznos lehet akkor, ha a hacker_ls programot valami szkriptbe ágyazzuk bele, ahol fel akarjuk dolgozni a kimenetét. Erre alább látunk is majd példát. o = kirírja a lista végére az altartalomjegyzékek és a fájlok darabszámát 0 = A 0 (nulla) kapcsoló esetén listázza a törött symlinkeket is, különben ugyanis kihagyja őket. 1 = Az 1 (egy) kapcsoló esetén NEM listázza a NEM törött symlinkeket, CSAK a törötteket. Ez csak akkor működik, ha a -0 kapcsolót is megadtuk! Vagyis ha a symlinkek közül CSAK a törötteket akarjuk kilistáztatni, akkor a -01 (vagy a -10 mert a sorrend lényegtelen) kapcsolókat mind meg kell adni. Ha például az aktuális tartalomjegyzékben kizárólag a symlinkeket akarjuk kilistáztatni, közülük is csak a törötteket, akkor így hívjuk meg a programot: hacker_ls -01 ---L Egy trükk: Tegyük fel, az adott tartalomjegyzékben meg akarjuk keresni az összes törött symlinket, és törölni akarjuk mindet. Ezt ezzel a szkripttel érhetjük el: #!/bin/bash for i in `hacker_ls -01 ---L --%n` do rm "$i" done Ha pedig nem az aktuális tartalomjegyzékben akarjuk megkeresni és letörölni a törött symlinkeket, akkor használjuk ezt a szkriptet: #!/bin/bash for i in `hacker_ls -P01 ---L --%n $1` do rm "$i" done E fenti szkript használata: TISZTIT konyvtarneve (amennyiben úgy neveztük el e szkriptet, hogy "TISZTIT") V = bőbeszédű üzemmód. Ilyenkor például tartalomjegyzékek összehasonlításánál kiírja a lista elejére, mely mappák közös elemeit listázza ki épp. & = A két megadott tartalomjegyzéket hasonlítja össze, és kiírja azokat az állományokat, amiket EGYEZŐNEK talált. Az hogy mikor tekint két állománybejegyzést egyezőnek, a relációstringtől függ, azaz attól ami 5 mínuszjellel kezdődik. A benne felsorolt karakterek jelentései közt ÉS kapcsolat van azaz mindegyiknek teljesülnie kell az egyezésnek tekintéshez! A jelentések: N : A két bejegyzés NEVE azonos L : Ha symlinkről van szó, egyeznie kell azon neveknek is amikre a symlinkek mutatnak. (többszörös láncolást nem követ végig, csak a közvetlen célt vizsgálja) l : Nem egyezik 2 állomány ha az egyik symlink a másik nem, vagy ha mindkettő symlink, de az egyik törött. m : A fileméretek egyezőek d : A fájltípusok egyezőek H : A jogosultságok egyezőek t : egyezik a tulajdonos g : egyezik a csoport V : egyezik az utolsó változtatás ideje E : egyezik az utolsó elérés ideje M : egyezik az utolsó módosítás ideje b : egyezik az EXT filerendszer összes speciális flagja (pld IMMUTABLE bit, stb) A formátumstringre vonatkozó szabályok: A formátumstringben a speciális jelentéssel bíró karaktereket a % jel kell megelőzze. Ha a % jelet olyan karakter követi melynek nincs meghatározott jelentése, kiírja a % jelet is és e karaktert is. Ami karaktert nem előz meg % prefix, azt is kiírja. A speciális karakterek: %% - a % jel %/ - újsor karakter %d - egy karakter, mely az állomány típusát jelzi. Ezek a következők: d: altartalomjegyzék (azaz könyvtár), -: közönséges(reguláris) fájl, l: szimbolikus link, b: blokkdevice, c: karakteres eszköz, s: socket, f: fifo, ?: ismeretlen %H - a chmod parancsnál oktális módon megadható mind a 4 számjegy egymás után, azaz hosszú formában kiírva a fájl jogai oktális módon. %r - a chmod parancsnál oktális módon megadható 3 számjegy egymás után, azaz rövid formában kiírva a fájl jogai oktális módon. %l - a fájla mutató hard linkek számát írja ki. %i - az inode-number számát írja ki. %T - A tuladonos neve %t - A tuladonos userid számát írja ki %G - A csoport neve %g - A csoport groupid számát írja ki %m - Az állomány mérete %I - Az ioblocksize értéke %b - Az EXT fájlrendszerre jellemző nem POSIX-szabvány szerinti speciális bitek (flagek) értéke egyetlen decimális egész számként. (unsigned long int). %B - Az EXT fájlrendszerre jellemző nem POSIX-szabvány szerinti speciális bitek (flagek) értéke STRINGként. Pontosan úgy, ahogy azt az lsattr parancs írná ki. %A - Allokált blokkok száma (allocatedblocks) %V - Az utolsó változtatás dátuma és ideje %v - Az utolsó változtatás dátuma (csak a dátum, eee.hh.nn formában) %y - Az utolsó változtatás ideje (csak az idő, OO:PP:SS formában) %f - Az utolsó változtatás ideje (csak az idő, OO:PP formában) %u - Az utolsó változtatás dátumának napstringje (pontosan 3 karakter) %z - Az utolsó változás dátuma napjának számkódja (0=vasárnap, 1=hétfő, stb) pontosan 1 számjegy %E - Az utolsó elérés dátuma és ideje %e - Az utolsó elérés dátuma (csak a dátum, eee.hh.nn formában) %Y - Az utolsó elérés ideje (csak az idő, OO:PP:SS formában) %F - Az utolsó elérés ideje (csak az idő, OO:PP formában) %U - Az utolsó elérés dátumának napstringje (pontosan 3 karakter) %Z - Az utolsó elérés dátuma napjának számkódja (0=vasárnap, 1=hétfő, stb) pontosan 1 számjegy %M - Az utolsó módosítás dátuma és ideje %a - Az utolsó módosítás dátuma (csak a dátum, eee.hh.nn formában) %Q - Az utolsó módosítás ideje (csak az idő, OO:PP:SS formában) %X - Az utolsó módosítás ideje (csak az idő, OO:PP formában) %q - Az utolsó módosítás dátumának napstringje (pontosan 3 karakter) %x - Az utolsó módosítás dátuma napjának számkódja (0=vasárnap, 1=hétfő, stb) pontosan 1 számjegy %n - Az állomány neve %J - Az állomány jogainak 9 karakter hosszú stringje, a megszokott "rwxrwxrwx" stílusban. Én e módszert nem kedvelem, mert helypazarló, kezdőknek, "mazsoláknak", "r=0" usereknek való, "Igaz Kocka" megvetéssel fordul el e stílustól, de hátha valaki olyan perverz, hogy ezt szeretné épp használni. %L - Azon állomány neve, amire a symlink mutat %> - e kapcsoló esetén, ha symlinket iratunk ki, a symlink neve előtt kiír egy "=>" karakterpárost ha a link élő, illetve egy "->" párost ha a link törött. Ha nem linket iratunk ki, akkor csak 2 darab szóközt ír ennek a helyén. azért, hogy a mezőhossz megmaradjon. A formátumstringben megadható bizonyos tételek mezőhossza és igazitási módja. Azon tételeknél, melyek hossza változó lehet. Ezek a következők: %l, %T, %G, %m, %n, %L A hossz és formátummegadás a következőképp történik: %j15m - ez a méretet 15 karakteres mezőben írja ki, jobbra igazítva. %j30n - ez a file (vagy a könyvtár) nevét 30 karakteres mezőben írja ki, jobbra igazítva. %b15m - ez a méretet 15 karakteres mezőben írja ki, balra igazítva. %b30n - ez a file (vagy a könyvtár) nevét 30 karakteres mezőben írja ki, balra igazítva. Hasonlóképp adhatjuk meg a többi felsorolt mezőnél is. Ha nem adunk meg b vagy j karaktert csak számot, akkor alapértelmezés szerinti irányba igazít. Ez a következő: nevek esetében ( %T, %G, %n, %L ) balra igazít, számok esetében ( %l, %m ) jobbra. Például: %20m egy 20 karakteres mezőbe írja ki jobbra zárva a méretet. %20n egy 20 karakteres mezőbe írja ki balra zárva a file nevét. Ha nem fér bele a mezőhosszba a kiiratandó adat, akkor nem veszi figyelembe a mezőhosszat hanem kiírja az egészet. Ha olyan adatnál adunk hossz-specifikációt (akár j vagy b-vel együtt akár enélkül) amely fix hosszúságú, azaz nem a fentebb felsoroltak valamelyike, akkor azt a hosszt egyszerűen nem veszi figyelembe, hanem kiírja a maga megszokott fix hosszúságában. Például: %45H vagy %j45H - ez hiába adtunk meg 45-öt, akkor is csak 4 karakter hosszan írja ki a file jogosultságainak oktális értékét.