textfájlban string keresés, fájl áthelyezése

Sziasztok!

- Környezet: windows 10, NTFS fájlrendszer.
- Egy mappában van körülbelül 1000 fájl (az alább részletezetteken kívül 4-6 db egyéb állomány van a mappában)

Fájlnévsablon: bizfejXXX000.bsb és biztetXXX000.bsb ezek sima szöveges állományok, tabulátorral tagolva
A fájlok párban vannak. Minden bizfej[bizonylatfej]-hez tartozik egy biztet[bizonylattétel] fájl is.

Feladat:
Meg kell keresni a bizfejXXX000.bsb fájlok közül azokat, amelyekben szerepel a 'feldolgozva' string.
A hozzá tartozó biztet fájllal együtt ezt át kell mozgatni egy előzetesen megadott mappába.

Milyen megoldás lenne erre e legegyszerűbb? Windows power shell (?) Python-ban vagy bármilyen más nyelven egy program írása? Minden megoldás érdekel! Nem konkrét megoldás érdekel, hanem hogy ki mit használna ennek a megoldására, kisvállalati környezetben. [mikrovállalati]

A programot, szkriptet rendszeresen, napi szinten egyszer le kellene futtatni, hogy a feldolgozott állományokat máshová helyezze.

Nem, a létrehozó programba nem tudok belenyúlni, azt az oldalt felejtsük el.

Minden építő jellegű ötletet köszönök!

Hozzászólások

Ha tudsz PowerShell-ül, akkor PowerShell, ha nem, de tudsz VBScript-ül, akkor az, ha nem, akkor Python (hogy ne feltétlenül kelljen plusz dolgokat telepíteni, vagy ha már kell, akkor a lehető legkevesebb - sima shell script is elég lenne neki, de egy teljes cygwin/msys/Linux Subsystem for Windows/akármi mást csak azért feltenni overkill)

Aztán feladatütemező.

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Én csak phpistis tudok gyorsan :(


<?php
$in="c:\\input";$out="c:\\output";
foreach (scandir($in) as $file)
if (preg_match("/bizfej(.{3})000.bsb/i",$file,$list) && preg_match("/feldolgozva/",file_get_contents($in.DIRECTORY_SEPARATOR.$file)))
{
    rename($in.DIRECTORY_SEPARATOR.$file,$out.DIRECTORY_SEPARATOR.$file); 
    $file[3]='t';$file[5]='t';
    rename($in.DIRECTORY_SEPARATOR.$file,$out.DIRECTORY_SEPARATOR.$file); 
};

Mindenkinek köszönöm a válaszokat, a php lett a nyertes, mert ahhoz értek annyira, hogy képes legyek megvalósítani.

Bár kicsit offtopic, de...
Egy mappában van körülbelül 1000 fájl
Az ilyen dilettáns rendszert villámgyorsan ki kellene irtani!
Bár akkor talán nem lenne problémád, feladatod...

Nem mintha kötözködnék...
A cyrus egy darab filét sem tárol mappában.
Indoklás:
1) Mappa a vindózon van.
2) A cyrus ún. maildir tárolást végez és nem mailmap. ;)
3) Igaz, a cyrus tárolhat 12000 fájlt egy helyen, de csak kényszerből, a trehány felhasználók miatt.
Azért mert megteheted, nem biztosan helyes.
4) A cyrus nem fut vindózon. (Vagy le vagyok maradva, de a cygwin nem ér.)
A kötözködést befejezvén.

Mindezt csak rutinból mondtam, mivel láttam már néhány - magukat igen okosnak tartó ember által elkövetett - rosszul működő rendszert.
Ami különös pikantériája a véleményemnek, hogy kifejezetten Windows környezetben még nagyobb ostobaság a sok fájl tárolása a szarul működő cache miatt. És itt nem az általam használt XP/SP2-ről van szó, hanem azokról a tesztekről, amit utoljára Window Server 2008R2/32GB ram/64 bites környezetben végeztem. Tekintettel arra, hogy semmivel sem kaptam jobb eredményt, mint a saját gépemen, élek a rosszindulattal: ez a fícsör a világ végéig meg fog maradni.

Visszatérve a cyrus-ra. Az azért eléggé kiforrott rendszer a topicnyitó rendszerhez képest. Bár ez is csak egy rosszindulatú sejtés. ;)

Szóval ez egy tapasztalaton alapuló vélemény, nem több. A cyrus jo válasz volt rá! :D

Hát személy szerint biztos .BAT fájlt írnék rá. A régi command.com-nál a cmd.exe W10-ben már biztos okosabb, de a "find" elég régi parancs, az "if" is, (ez kb. az fgrep), a move az 6.0-s DOS óta létezik - úgy kb ezek kellenének hozzá. De tényleg nem triviális a dolog, mert legalább 10 éve nem kellet BAT-fájlokat írjak.

Powershellt mindenképp érdemes megtanulni szerintem annak, aki Windows környezetben mozog. Egyrészt baromi jól integrálódik a Microsoftos cuccokkal, egész komoly programok is összerakhatóak vele azáltal, hogy ott van mögötte a .NET. Nekem nagyon tetszik, hogy deklaratív módon programozható, és objektumok utaznak a pipelineokon, nem kell string reszeléssel foglalkozni. Szórakozásból összeraktam a feladatot megoldó scriptet:


$sourceDir = 'innen'
$targetDir = 'ide'

ls -Path $sourceDir -Filter 'biz*.bsb' |
	group {$_.Name -replace '^biz(fej|tet)'} |
	where {$_.Group | where {$_.Name -match '^bizfej'} | cat | where {$_ -match 'feldolgozva'}} |
	foreach {$_.Group | mv -Destination $targetDir}

PowerShell egysoros megoldás:

(gci bizfej*000.bsb |sls "feldolgozva").Path.Replace("fej", "*") |mi -d targetdir

Nem akarod elolvasni, amit ide írtam, mert minden, ami jó/rossz a PowerShell-ben, ebben benne van.

1. gci - Get-ChildItem --> kb. a dir vagy az ls megfelelője, fájllistát ad vissza.

2. sls - Select-String --> kb. a grep megfelelője, azt csinálja, hogy a kapott fájllistán végigmegy, mindegyik fájlban megpróbálja megkeresni a megadott stringet, majd visszaad egy listát, ami a találatokat tartalmazza.

3. A visszaadott listán elemeiről lekérem a Path property-ket, eredmény egy lista természetesen.

4. Ezen a listán meghívom a Replace metódust, ami lefut minden elemre és kicseréli benne a "fej" stringet "*" stringre.

5. mi - Move-Item --> kb. a sima mv parancs, a -d a destination directory, az meg hogy mit mozgasson, az inputként kapott tömbből jön.

PowerShell-ben is kiválóan lehet gányolni :-D