Sziasztok!
Van egy nagyobb mennyiségű (több mint 100.000 db) file-om. Mindegyikben megtalálható a következő tag : 2009-02-18T18:01:10.
Szeretném, ha azokat a file-okat, amelyeknél ez a dátum értéke nagyobb mint 2009-02-19T00:00:00 átmozgatná egy másik mappába.
Ebben kérném segítségeteket. Sajnos nem vagyok egy script guru, és elég sürgős is lenne.
Köszönöm a segítséget előre is.
Del
- 1252 megtekintés
Hozzászólások
Akkor most megpróbálom magyarról magyarra fordítani a kérdést, meglátjuk hogyan megy.
Szóval ha jól értem:
1. Van egy nagy rakás szoveges fájlod, amit a file belsejében található időadat, és nem a file létrehozás/módosítás dátuma alapján szeretném szétválogatni.
2.) valahol a fájlokban van egy YYYY-MM-DDThh:mm:ss formátumú dátummező.
Hogy ez önálló sorban van-e, esetleg valamilyen fix sorszámú sorban, vagy lehet-e több ilyen is egy file-ban, arról nem nyilatkoztál.
Aztán van még pár paraméter, amitől erősen függhet a megoldás:
3.) Egy könyvtárban van-e ez az rengeteg file, hogy már egy ls * parancs is elhasaljon, vagy valami konyvtarszerkezetben?
4.) A filenevek "normalisak", vagy kell számítani bennük szóközre, kettőspontra, stb.-re?
Ha ezek a feltételezések helyesek, vagy nem azok, de módosítod őket, akkor elkezdhetünk a megoldáson is gondolkodni.
- A hozzászóláshoz be kell jelentkezni
Válaszok: :)
1. Igen, a szövegben található az időadat.
2. Igen, és nem önálló sorban van. (Igazából ezek xml fileok)
3. Egy könyvtárban van az osszes.
4. A filenevek normalisak. :)
- A hozzászóláshoz be kell jelentkezni
Szuper, ez már nagy fejlődés.
2/a.) Van esetleg egy speciális tag, ami közrefogja? Esetleg tudsz hozzá komplett xpath-t mondani?
Addig is így elsőre:
( ls | xargs egrep '[0-9]{2}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}' | sed 's/^\([^:]*\):.*\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}T[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}).*$/\1 \2/' | awk '$2>"2009-02-19T00:00:00"{print $1}' ; echo ujkonyvtar)| xargs mv
De ha xml-ben van az adat, akkor inkább valami xml-specifikus keresést használnék. És valószínűleg ruby-ban bűvészkednék kicsit a hpricot vagy a nokogiri gemekkel.
- A hozzászóláshoz be kell jelentkezni
"2/a.) Van esetleg egy speciális tag, ami közrefogja? Esetleg tudsz hozzá komplett xpath-t mondani?"
'<'XmlLogTime'>'.......'<'/XmlLogTime'>' az aposztrófok persze nincscsenek benne
- A hozzászóláshoz be kell jelentkezni
Ha a fájlnévben van, és a hónap, nap, óra, perc, másodperc minden esetben két jegyen van megadva, akkor a névből ezt az időbélyeget kivágnám (pl. cut-tal), törölném belőle a nem szám karaktereket (tr -cd "[:digit:]"), aztán ezt hasonlítanám (test ez -gt 20090219000000) össze a kérdéses időbélyeg hasonlóképp számmá konvertált verziójával.
- A hozzászóláshoz be kell jelentkezni
egy lehetseges megoldas
for FILE in $(ls -1); do DATE=$(cat $FILE | egrep '....-..-..T..:..:..' | awk '{hol = match($0, /....-..-..T..:..:../ ); print substr($0, hol, 19)}' |tr -cd *[:digit:]*); if [[ "$DATE" -gt "20090219000000" ]]; then mv $FILE {AHOVA_AKAROD}; fi; done
- A hozzászóláshoz be kell jelentkezni