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.