Sziasztok!
Próbálom a biztonsági kamera felvételei közül a napok adott időszakában (00:00 - 06:00) létrehozott állományokat törölni.
Ennyit eszkábáltam eddig össze:
find ./ -type f -ls | while read file; do tor=$( echo $file | awk -F ' ' {print $10}' | awk -F ':' {print $1}' ) echo $tor ; if [[ "$tor" -lt "6" ]] ; then echo $tor ; fi ; done
Mi lenne a helyes megoldás?
- 2868 megtekintés
Hozzászólások
Milyen disztró melyik verziója?
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Mindegy is. :)
PowerShell telepítés így: https://github.com/PowerShell/PowerShell/blob/master/docs/installation/…
Megoldás PowerShell-ben:
Nevek listázása:
Get-ChildItem -Recurse -File -Force | Where-Object {$_.LastWriteTime.Hour -lt 6} | % { $_.FullName }
Megfelelő file-ok törlése:
Get-ChildItem -Recurse -File -Force | Where-Object {$_.LastWriteTime.Hour -lt 6} | Remove-Item
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Köszönöm!
Volt egy már elfeledett PowerShell installáció és Múkodott!
Ettől függetlenül érdekelne a find-os megoldás.
- A hozzászóláshoz be kell jelentkezni
Talán nem kell hozzá Powershell...
$ find . -type f -newermt "00:00:00" ! -newermt "06:00:00" -exec rm {} \;
- A hozzászóláshoz be kell jelentkezni
De lehet ;) Oktatási célja volt, na...
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Okulni akartam, rákerestem...
Ha valaki érzékeny rá...
By default, PowerShell collects the OS description and the version of PowerShell (equivalent to $PSVersionTable.OS and $PSVersionTable.GitCommitId) using Application Insights. To opt-out of sending telemetry, delete the file DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY before starting PowerShell from the installed location. The telemetry we collect fall under the Microsoft Privacy Statement.
- A hozzászóláshoz be kell jelentkezni
Köszönöm a javaslatot!
Rendszer: Ubuntu 17.10
A parancs hiba üzenet nélkül lefut, de nem töröl.
Hogyan lehet kiírni {} tartalmát?
- A hozzászóláshoz be kell jelentkezni
Nálam működik... Van írási jogod? (Ja, és debian testing, de nem hiszem, hogy ebben az esetben ez bármit is számítana...)
- A hozzászóláshoz be kell jelentkezni
Ez csak kiírja a fájlok nevét:
$ find . -type f -newermt "00:00:00" ! -newermt "06:00:00" -print
- A hozzászóláshoz be kell jelentkezni
Igen. Most már, hogy van olyan állomány is a könyvtárban, aminek a mai nap a dátuma, nekem is van találat, de csak a mai.
A PowerShell-es megoldás hozza a korábbi dátumú állományokat is. Van ilyen megoldás find használatával? A manual olvasásából ezt gondoltam volna.
- A hozzászóláshoz be kell jelentkezni
Az időpont elé meg lehet adni dátumot is yyyy-mm-dd formában, majd ciklus. Ha esetleg a fájlok nevei tartalmazzák az időbélyeget, akkor egyszerűbb lehet egy mintaillesztéssel.
- A hozzászóláshoz be kell jelentkezni
Ebben a feladatban a pwsh kézreállóbbnak tűnik.
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Még egyet azért próbálkoznék (csak a fájllista előállítása)...
$ find . -printf '%Tc %p\n' | grep " 0[0-5]\:" | awk '{print $6}'
- A hozzászóláshoz be kell jelentkezni
Nálam erre a sorra is illeszkedik, pedig nem kéne: "Tue 09 Feb 2016 02:40:17 PM STD ./OLD" és annyit ad rá, hogy "PM"
Jobb erre a pwsh. :)
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Akkor megnézi, hogy find-ja milyen sorrendben írja ki a dátum elemeit, és átírja az awk-ban a mezőszámot. Vagy csak ezért installálja és megtanulja a powershellt...
- A hozzászóláshoz be kell jelentkezni
...és ügyel, hogy ne matcheljen a filenév a regexre.
A pwsh évtizedekkel korszerűbb a Unix-os shellek szövegfeldolgozásánál, érdemes ennek az előnyeit kihasználni.
Ma egyre inkább igaz, hogy írd meg egyszer és futtasd utána ahol csak bírod - ebben a hagyományos shell scriptingnek fájdalmas hordozhatósági gondjai vannak.
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Hajrá!
- A hozzászóláshoz be kell jelentkezni
Köszi, próbáld ki Te is!
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Nem tervezem. Eddig is jól elvoltam nélküle, és azt hiszem, ez már így is marad...
- A hozzászóláshoz be kell jelentkezni
+100000
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Szerencsére egyelőre nincs FreeBSD alá PWSH, míg winre ugye most már van (ba)sh és awk is. Akkor melyik scriptnek van esélye több OS-en futni?
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
:-P
- A hozzászóláshoz be kell jelentkezni
Nem értem, miért szerencse az, hogy egy szabad szoftver nem elérhető FreeBSD-re...
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Nem kell megtanulnom egy számomra nehézkes nyelvet csak azért, mert állítólag modern és hordozható, hanem használhatom azokat az eszközöket, amelyeket már megismertem és többé-kevésbé tudok is használni, és ráadásul multiplatform.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
Nem gondoltam volna, hogy mindent meg kell tanulj, ami FreeBSD-re elérhető. :)
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Vagy print helyett printf, és úgy írja ki a dátumot, filenevet, akármit, ahogy szeretné. Mondjuk kiírja az mtime-ból az órát meg a fájl nevét, egy awk-kal a kimenetből kiválogatja azokat, ahol az első mező kisebb, mint 6, és kiírja a második mezőt (fájlnév) - ezt meg simán megeszi egy xargs rm, oszt' jó'van.
- A hozzászóláshoz be kell jelentkezni
Ez hozta a kívánt állományokat.
Köszönöm!
- A hozzászóláshoz be kell jelentkezni
Van -delete
--
Gábriel Ákos
- A hozzászóláshoz be kell jelentkezni
Meg van \+ is :-)
- A hozzászóláshoz be kell jelentkezni
Nálam működik... Van írási jogod?
- A hozzászóláshoz be kell jelentkezni
A find relative kevés fájl esetén príma, ha sok (tízezres nagyságrend és fölötte) fájl közül kell szelektálni, akkor azért verziótól függően marha lomha tud lenni (van, ami fájlonként legalább kettő stat/fstat hívással operál...) - pont ilyenre írtam anno Perl-ben egy aprócska toolt: felolvassa a könyvtárat, minden fájlra,a minek a neve illeszkedik a paraméterként megadott mintára indít egy darab stat-ot, és az abból kaptt idő(k) alapján listáz vagy töröl.
- A hozzászóláshoz be kell jelentkezni
Perl-ben egy szösszenet:
use File::stat;
my $kvt = ".";
opendir( my $dh, $kvt ) || die "Can't opendir $kvt $!";
while ( readdir $dh ) {
my $stat = stat($_);
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
localtime $stat->mtime;
if ( $hour > 18 ) {
printf "%s\t%02d:%02d\n", $_, $hour, $min;
# unlink $_;
}
}
Jelen állapotban kiírja az aktuális könyvtárban azon fájloknak a nevét és a mtime-ból az óra:perc értéket, amiknél a készítés idejében az óra kisebb, mint 6. Ha az unlink-es sor elől kiveszed a "#"-et, akkor törli is az adott fájlt.
- A hozzászóláshoz be kell jelentkezni
Amennyiben a "> 18" helyes kiejtése "< 6" :)
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Elírtam, és te ügyesen lockoltad - ilyenkor nem az adott hsz.-ra válaszolunk, hanem sima hsz-ban jelezzük a problémát vagy privát üzenetet küldünk, etc, de nem vagy ennyire új fiú errefelé, hogy ezt magyarázni kéne neked... :-P
Egyébként Windows alatt szenvedek a kopipasztával meg az ablakváltással (Alt+TAB mesebeli, hol van, hol nincs, szerencsére a Win+TAB működik), úgyhogy erre is lehetne valami jó javaslat, hogy az alt+tab-ot mé' nem szereti néha ez a csoda jószág... :-)
- A hozzászóláshoz be kell jelentkezni
Akkor már azt a ketyegő bombát sem tudod hatástalanítani, hogy a scripted könyvtárakat is visszaad és csak az unlink kegyessége menti meg azokat a törléstől. Viszont, ha valaki máshogy töröl, akkor robbanhat... :D
Finomítási lehetőség:
use File::stat;
use Fcntl ':mode';
my $kvt = ".";
opendir( my $dh, $kvt ) || die "Can't opendir $kvt $!";
while ( readdir $dh ) {
my $stat = stat($_);
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
localtime $stat->mtime;
if ( $stat->mode & S_IFREG && $hour < 6 ) {
printf "%s\t%02d:%02d\n", $_, $hour, $min;
# unlink $_;
}
}
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Akkó mán enkább a fájnd a '-f' kapcsolóva e!!! :)
- A hozzászóláshoz be kell jelentkezni
Úgy is lehet.
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Apró nüansznyi különbség, hogy (verziófüggően) van olyan find, ami minden fájlra, amit talál, csinál stat() és fstat() hívást _is_. Ha illeszkedik a teljes kifejezésre, akkor a tevékenységtől függően ezt akár meg is ismétli. (RHEL5/6 esetén láttam ilyet, ha jól rémlik). Százezres darabszám esetén azért marhára nem mindegy a legalább dupla darabszámú rendszerhívást megcsinálni....
- A hozzászóláshoz be kell jelentkezni
Hat itt azert a usecase nem 100K file kezelese, de mondjuk nem vagyok biztos benne.
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy itt nem, én ezzel csak arra szerettem volna felhívni a figyelmet, hogy a find jó, de van, amikor felejtős. Például a névre, időadatokra "lóugrásban" illeszkedő fájlok keresése tíz- meg százezer fájl között már lehet, hogy más módon közelebb lesz az optimálishoz.
- A hozzászóláshoz be kell jelentkezni
ne erts felre totalisan egyetertek veled. csak azt mondtam, hogy itt jo a -f, mert nem 100K file-t kell kezelni. Ha 100K, 100M file-t kell kezelni mar tuti nem celszeru shell-t hasznalni, sot python progit sem a singlecpu modeljevel. Onnantol C, Java, Scala, stb., barmi. :D
- A hozzászóláshoz be kell jelentkezni
A probléma nekem többszázezres-milliós számosságú fájlt tartalmazó, ext3-ra pakolt átmeneti könyvtáron jött elő - a cron-ból futtatott "find (cfra mintaillesztések sorozata) -mtime... satöbbi" parancs nem futott le belátható idő alatt, és kellett valami megoldás.
A strace alapján derült ki az adott find implementáció problémája a dupla-tripla stat/fstat rendszerhívásokkal, és erre készült gyors megoldásként egy perl script, ami az opendir, readdir, mintailleszt fájlnévre, ami ha illeszkedik, akkor stat, ha régi, akkor unlink folyamatot csinálta végig. Gyors lett, jóval gyorsab, mint más - lehet, hogy C-ben megírva még gyorsabb lett volna, de akkor és ott ez is elég volt.
Itt egyébként tényleg elég lehet a find -f , egy jól irányzott printf ("%Tk %p\n") aztán mögéakasztani egy awk '$1<6 { print $2}'-t, az egész kimenetét meg odaadni egy xargs rm-nek...
- A hozzászóláshoz be kell jelentkezni
No, hadd legyen már itt egy pythonos megoldás is; nem túl hosszú, de pontosan azt teszi, amit akarunk; nincsennek side effect-ek, és elég jól olvasható.
sys.argv[1]: a parancssorban megadott könyvtár;
törlés: a "print" helyett os.remove(fpath);
tstart, tstop révén az időpont meghatározása nem mintaillesztéssel (regex,grep) történik;
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import os, sys, datetime as dt, os.path as op
tstart= dt.datetime(2013,5,2, 22,11,50)
tstop= dt.datetime(2013,5,2, 22,27,00)
for currentdir, subdirs, files in os.walk(sys.argv[1]):
for fname in files:
fpath= op.join(currentdir,fname)
dd= dt.datetime.fromtimestamp(op.getmtime(fpath))
if tstart<=dd<=tstop:
print(fpath, dd)
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Ha jól olvasom a kódodat, csak az a baja, hogy az eredeti feladat szerint bármelyik nap 0 óra és 6 óra között létrejött fájlokat kellene törölni...
- A hozzászóláshoz be kell jelentkezni
Bocs, előreszaladtam; elkapott a vadászösztön:-)
Akkor e helyett:
if tstart<=dd<=tstop:
valami ilyesmi kell:
if dd.hour>=0 and dd.hour<6:
És a tstart meg a tstop nem is kell.
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Ha jól tippelem, a dd.hour nemnegatív egész, ergo a dd.hour<6 elég...
- A hozzászóláshoz be kell jelentkezni
Átírhatta volna, de te ügyesen lockoltad - ilyenkor nem az adott hsz.-ra válaszolunk, hanem sima hsz-ban jelezzük a problémát vagy privát üzenetet küldünk, etc, de nem vagy ennyire új fiú errefelé, hogy ezt magyarázni kéne neked... :-P
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Védőbeszéd:-)
"Ügyfelem nem is tagadja a sajnálatos tettet, ám védelmére felhozható, hogy előzőleg BASH-sal is próbálkozott, aminek következtében a hivatkozott kódot még erős mintaillesztéses befolyásoltság állapotában rögzítette."
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Ahogy nálam a 18 óra, mint időlimit - a tesztkönyvtárban korai fájlok nem voltak :-)
- A hozzászóláshoz be kell jelentkezni