hi,
bocs, a kategória több, mint valószínű nem korrekt. Hogy lehetne a legegyszerűbben megvalósítani, hogy több 1000 html fileból kitöröljem ugyanazt azt ismétlődő html worm-ot?
Egy adott user homejában felülírtak minden html-t, a következő stringgel:
Mentés van, de csak holnap tudom visszapakolni, viszont, ha létezik vmi egyszerű módszer, helyretenném itthonról.
köszi!
- 4196 megtekintés
Hozzászólások
Néhány ötlet (nem teljes megoldás, nem végig átgondolva):
- Van lehetőség Perlben többsoros keresésre: http://pastebin.com/gc7QYVje
Így kideríthető, hogy mely fájlok érintettek. (Vagy más út: itt a feltételt kicserélheted az ellentétére (azaz, hogy csak olyankor nyomtasson, amikor épp nem látja a többsoros mintát).)
- grep -v minta fájl > újkönyvtár/fájl segítségével az adott minta kivételével a többi sor átkerül az új fájlba. (Feltételezem, hogy nem kell a teljes wormot megadni mintaként, hanem elég csak néhány szám a kódból; de ezt előzőleg érdemes ellenőrizni).
Ha minden rendben levőnek tűnik, akkor az újkönyvtár/fájl-okkal felülvághatod az eredeti fájlokat. (Gondolom, nem kell hangsúlyoznom, hogy grep ... fájl > fájl nem megpróbálandó.)
- A hozzászóláshoz be kell jelentkezni
Például sed segítségével. A -i kapcsoló helyben hajtja végre a műveletet a fájlon.
(1) Ha egy sorban van a kártékony kód akkor egy egyszerű cserével: s/KÁRTÉKONY_KÓD//g
(2) Ha több sorban van akkor a sorok törlésével: /KÁRTÉKONY_KÓD/,/KÁRTÉKONY_KÓD/d
Ahol a KÁRTÉKONY_KÓD egy értelem szerűen megválasztott reguláris kifejezés.
Rekurzívan a szükséges fájlokra:
find /ahol/a/fajlok/vannak -iname "*.html" -print0 | xargs -0 sed -i "(1) vagy (2)"
--
maszili
- A hozzászóláshoz be kell jelentkezni
Fejből nem tudom, mennyi a parancssor max. hossza, de ha sok fájl van az adott könyvtár struktúrában, akkor én a "-print0 | xargs ..." helyett "-exec ... {} \;"-t használnék.
- A hozzászóláshoz be kell jelentkezni
Légy szíves olvasd el az xargs dokumentációt. Köszi.
--
maszili
- A hozzászóláshoz be kell jelentkezni
Jó, a -0 kimaradt.
Ettől függetlenül én jobban szeretem sok fájlnál a -exec-t használni.
upd: főleg azért, mert az xargs hozzáfűzi a parancssor végéhez a paraméter(eke)t, míg a find -exec segítségével oda teszem, ahol nekem kell. Most nem tudnék konkrét példát hozni, de jártam már úgy, hogy bizonyos kapcsolókat, paramétereket csak a beillesztendő fájlnév mögé lehetett írni.
- A hozzászóláshoz be kell jelentkezni
Minél több a file, annál pazarlóbb az -exec. Még mielőtt valaki azt hiszi hogy sok fájl esetén jobb ezt választani.
Esetleg egy --follow-symlinks amit be lehetne még tenni a sed-nek, bár nem hiszem hogy olyan marha sok symlink lenne. Illetve a hardlinkek, az ellen nem véd.
- A hozzászóláshoz be kell jelentkezni
Tény, ezt nem is vitattam. A parancssor hosszával volt gondom, de amint látom, manapság ez már nem okoz problémát.
Bár ha ezt nézem:
# find / -print0 | xargs -0 echo "---"
xargs: echo: Bad address
Ezt a routerem produkálta. Mondjuk lehet neki ezer más oka is.
- A hozzászóláshoz be kell jelentkezni
> Ezt a routerem produkálta
Routereken tipikusan millio eves busybox van, ami szar. (Lehet finomitani, de attol ez meg teny marad.) En futottam bele abba, hogy dobaltam el *.zip-eket, mert az unzip CRC-hibakat mondott ra, Aztan kiderult, h busybox beepitett unzip-je es ha rakok ra "valodi" unzip-et, akkor mar nem lesz CRC-hibas. (De az elmult evekben talaltam ezen kivul meg jopar elbaltazott busybox hibat.)
- A hozzászóláshoz be kell jelentkezni
Ha pl. 255 a paraméterek megengedet maximásis száma akkor 100000 file feldolgozása esetén a következőkkel lehet számolni:
(1) "-print0 | xargs -0" esetén 100000/255 ~ 392 számú program indítás történik
(2) "-exec ... {} \;" esetén minden fájlra meghívja a feldolgozó programot tehát 100000 program indítás történik
Költői kérdés: Melyik módszer költségkímélőbb? ~392 program indítás vagy 100000 program indítás?
--
maszili
- A hozzászóláshoz be kell jelentkezni
Költségkímélést nem említettem.
Parancssor max. hosszt és az átadott fájlnév pozicionálását emlegettem.
Apropo, közben man ugyan nincs kéznél, csak egy xargs --help kimenetét tudtam megnézni, de nálam ezt írja:
-0, --null Items are separated by a null, not whitespace.
Disables quote and backslash processing
Összekevertem a "-1" kapcsolóval, ami talán linuxon, talán hpux-on volt és egyesével adogatta a beérkező paramétereket a futtatandó parancsnak.
Közben kipróbáltam, wheezy-n nem okoz gondot a parancssor hossza, feldarabolja. Velem még csinált hülye vicceket, igaz, nem mostanában. (már nem emlékszem, hogy csak hibaüzenet volt az eredmény vagy simán elhagyta a kilógó elemeket)
- A hozzászóláshoz be kell jelentkezni
Igy mar ertem miert ezt javaslom, de igy se jo, mert az xargs -I opciojaval meg lehet mondani, hogy mit hova szurjon be a parancssorba, azaz | xargs -0 -I '{}' ize '{}' mize '{}' ecet '{}' formaban pont ugy mukodik, mint a find (ahol viszont szabvanyosan biztos nem lehet a {} -t megvaltoztatni masra - raadasul nem zereti, ha valami hozza van raasztva, mert akkor nem cserel "mv {} {}.old" pl).
- A hozzászóláshoz be kell jelentkezni
Na ez viszont számomra teljesen új, tényleg időszerű lenne újra előszedni a manualt. Nem követem a fejlesztéseket.
- A hozzászóláshoz be kell jelentkezni
A tied pont a rossz megoldas, leven minden fajlra futtatja a programot, mig az xargs annyi fajlonkent, amennyi meg epp belefer az altalad felvetett parancssori limitbe.
find ... -exec sed
- 1 fajl eseten 2 processz (find, sed)
- 2 fajl eseten 3 processz (find, sed, sed)
- 3 fajl eseten 4 processz (find, sed, sed, sed)
- n fajl eseten n+1 processz (find, sed, sed, sed, ..., sed)
find ... -print0 | xargs sed
- 1 fajl eseten 3 processz (find, xargs, sed) es 1 pipe
- 2 fajl eseten 3 processz (find, xargs, sed tobb parameterrel) es 1 pipe
- 3 fajl eseten 3 processz -"- es 1 pipe
- n file eseten meg mindig nagy esellyel sokkal kevesebb processz es 1 db pipe
Azaz realisan 3 fajl folott mar olcsobb (kerdes, milyen draga a fork, exec es pipe). Persze elofordulhat, hogy olyan brutal hosszu fajlnevek lesznek, hogy szerencsetlen xargs kenytelen mindegyikhez uj sed-et forkolni. De altalaban az a ritkasag.
- A hozzászóláshoz be kell jelentkezni
A routerem erről nem tud. ;)
(ha túl sok nevet adok át az xargs-nak, akkor nemes eccerűséggel egy "Bad address" üzenettel elhasal - busybox fut rajta egyébként)
- A hozzászóláshoz be kell jelentkezni
Milyen jo, hogy pont azt irtam fentebb, h a busybox szar :-)
- A hozzászóláshoz be kell jelentkezni
Ühümmm... és egyet is értek vele, csak - lehet, hogy épp ezért - néha ilyesmik maradnak meg bennem. Bár pont az xargs és a max. parancssor hossz az régebbi. Vagy hpux, vagy régi linux, vagy talán még solaris-os maradvány.
Csak arra emlékszem, hogy nagy szopás volt belőle, ezért nagy ívben kerülöm azóta is, ahol csak lehet. :)
- A hozzászóláshoz be kell jelentkezni