Sziasztok!
Régen foglalkoztam linux-al, de most meg kellene írnom egy olyan scriptet, mely egy adott könyvtárban megkeresi a legrégebben létrehozott könyvtárat és azt letörli!
Valaki tudna nekem ebben segíteni?
Köszi
- 4942 megtekintés
Hozzászólások
man ls
man head
man rm
man stat
Meg google:
http://unix.stackexchange.com/questions/20460/how-do-i-do-a-ls-and-then…
Szerk:
Amúgy nem feltétlen tudod elérni a létrehozás időpontját, ezért szerkesztettem meg az amúgy szűkszavú bejegyzést. Creation date!=Modification date
- A hozzászóláshoz be kell jelentkezni
Kivéve ha a könyvtárakban lévő fileok létrehozási dátumát hasonlítja össze. Elvileg logikus hogy a legrégebbi könyvtárban van a legrégebbi file. Az a könyvtár pedig amelyik nem tartalmaz filet ebben az esetben figyelmen kívül hagyható.
-
Debian Squeeze
- A hozzászóláshoz be kell jelentkezni
Miért hagyható figyelmen kívül? Ha egyszer az lett korábban létrehozva, csak épp nem került bele semmi, akkor az a törlendő.
- A hozzászóláshoz be kell jelentkezni
Az a tippen, hogy pont ezért írta.
- A hozzászóláshoz be kell jelentkezni
Jó tipp. :)
-
Debian Squeeze
- A hozzászóláshoz be kell jelentkezni
:-D
- A hozzászóláshoz be kell jelentkezni
Jó, de akkor se értem, hogy ha figyelmen kívül hagyja akkor hogy fogja letörölni (pedig le kéne).
- A hozzászóláshoz be kell jelentkezni
Így értettem: a megoldás azon részét nem kell túltárgyalni, mert egyértelmű.
-
Debian Squeeze
- A hozzászóláshoz be kell jelentkezni
mkdir /tmp/elso
mkdir /tmp/masodik
mkdir /tmp/harmadik
touch /tmp/masodik/file
touch /tmp/elso/file
Ebben az esetben a legrégebbi fájl a "masodik" konyvtárban van. Az üres könyvtár meg a "harmadik". De az "elso" könyvtár az, amit törölni kellene, pedig abban van a lefgrissebb fájl. Ezért értelmetlen a fájlok dátumát figyelni (pláne ha az ctime). Ahogy Johans megírta, a legrégebben létrehozott könyvtár megkeresése nem annyira egyszerű, és pl. ext4-en megoldható, de az ext3 még nem tartalmazza ezt az információt.
- A hozzászóláshoz be kell jelentkezni
Nem lehet hogy a régi könyvtárban új file -akkor az éppen _nem_ az amit törölni kell? Mi értelme lenne új fileokat törölni csak mert régi a könyvtár? (Jó-jó, ez a feladat. Csak nem szoktam hozzá hogy nemlétező problémákat oldjak.)
-
Debian Squeeze
- A hozzászóláshoz be kell jelentkezni
Én se tudok elképzelni olyan esetet, amikor épp erre lenne szükség, de így legalább kiderült, hogy ha mégis ilyen kell, akkor pl. ext4-en megoldható a feladat. Illetve az már inkább lehet kérdés, hogy két fájl közül melyik lett hamarébb létrehozva, függetlenül attól, hogy melyik, mikor lett módosítva.
- A hozzászóláshoz be kell jelentkezni
A fenti segítséghez egy másik ami kellhet.
man find
- A hozzászóláshoz be kell jelentkezni
Amúgy a legrégebben létrehozott könyvtárat a szokványos módszerekkel nem lehet megtalálni, mert a fájlrendszer nem tartalmazza(*) a szükséges információt. Ezért ha a feladat az, hogy mindenképpen az törlődjön ami a legrégebben lett létrehozva, akkor pl. a könyvtár nevét kell megfelelően megválasztani. Utólag ez persze nem szokott segíteni.
Az általában elvárt dolog, ahogy azt a könyvtárat keressük, ami a legrégebben módosult. Ennek ugyan semmi köze nincs ahhoz, hogy mikor jött létre, de az abban tárolt fájlok lesznek a legrégebbiek. Már ha vannak benne :D
*) más unixok/bsd alatt vannak kivételek.
- A hozzászóláshoz be kell jelentkezni
Majdnem igaz. A POSIX-nak nem része. Az újabb fájlrendszerek (pl. ext4) már tárolják a szükséges információt, csak userként kinyerni nem triviális. Rootként viszont működik (ext4-en, talán ext3-on is):
# debugfs -R 'stat /home/johans' /dev/sda5
Inode: 34471938 Type: directory Mode: 0755 Flags: 0x81000
Generation: 3037830183 Version: 0x00000000:00002853
User: 1000 Group: 1000 Size: 12288
File ACL: 0 Directory ACL: 0
Links: 82 Blockcount: 24
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x50175563:9b04e024 -- Tue Jul 31 05:47:47 2012
atime: 0x50175576:b6178a20 -- Tue Jul 31 05:48:06 2012
mtime: 0x50175563:9b04e024 -- Tue Jul 31 05:47:47 2012
crtime: 0x4ef35865:7a4de864 -- Thu Dec 22 17:18:45 2011
Size of extra inode fields: 28
EXTENTS:
(0):137895969, (1-2):137896476-137896477
- A hozzászóláshoz be kell jelentkezni
Áh, megint tanultam valamit :) Nekem ext3-on nem látszott crtime, ext4-en valóban ott lapul :D Viszont a gonosz stat(1) nem írja ki :(
- A hozzászóláshoz be kell jelentkezni
Mert a stat(1) POSIX cucc, a crtime meg nem POSIX cucc.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Jó, de más parancsot nem ismerek arra hogy fura információkat lehessen lekérdezni fájlokról, könyvtárakról :D
- A hozzászóláshoz be kell jelentkezni
biztos nem a legszebb, de:
path="/valahol/valami/mappa"
olddir=`ls -1t "$path" | tail -n1`
rm -rf "$path/$olddir"
Az idézöjelekkel a space-es mappanevekkel is boldogul a script.
Nálam kb ez a backup rotáló scriptek alapja is. Eddig bevált :)
- A hozzászóláshoz be kell jelentkezni
És ennek mi köze a legrégebben létrehozott könyvtárhoz?
- A hozzászóláshoz be kell jelentkezni
"...egy adott könyvtárban megkeresi a legrégebben létrehozott könyvtárat és azt letörli"
;)
Kipróbáltad mit tesz a kódrészlet?
Az eredmény ugyanaz...
- A hozzászóláshoz be kell jelentkezni
Nézz utána, hogy mi szerint rendez az ls -t...
Aztán hasonlítsd össze azzal, mit szeretne a nyitó.
- A hozzászóláshoz be kell jelentkezni
Ok, lehet nem olvastam el túl részletesen, és nem olvastam teljesen végig a topic-ot, sry, de azt ne mondja nekem senki, hogy bizonyos esetekben nem egyezhet meg a létrehozás/módsítás/stb dátuma!
Ki tudja, hogy épp nem egy backup mappát akar letörölni, amit egyszer létrehozott aztán utána többet nem is módosított? Leírta ezt valahol konkrétan miért pont ezt szeretné?
Ennyi erövel RTFM és hasonlókat is lehetne bárkinek írni, mert google-val és a manual-ok olvasásával elöbb-utóbb meg lehet találni a megoldást.
De egyszerübb nekiugrani a másiknak... aztán csodálkozik mindenki, hogy miért nem kap normális segítséget az ember és trollkodják és offolják szét a topic-okat...
- A hozzászóláshoz be kell jelentkezni
Valami ilyen kellhet neked. Nem dolgoztam ki a végletekig:
find ./ -cmin -1200 -type d -ls
Vagy esetleg: ls -rtl
- A hozzászóláshoz be kell jelentkezni
-
- A hozzászóláshoz be kell jelentkezni
.
- A hozzászóláshoz be kell jelentkezni
OLDEST_DIR=$(ls -1td $(find ./ -maxdepth 1 -type d | grep -xv "./") | tail -1)
echo $OLDEST_DIR
Szokozokkel, spcialis karakterekkel nem banik jol, de ha csak altalad (pl scriptbol) letrehozott konyvtarak vannak, akkor tudhatod, hogy vannak-e ilyenek vagy sem.
A "./" kiszurese meg fontos, mert ha fileletrehozas tortenik benne, akkor a "." lesz az utoljara modosult, azt meg veletlenul se szeretned torolni golndolom. Es persze ha atirod es nem ./-ben keresel akkor ne felejtsd el a grep-et is atirni.
Szandekosan nem irtam bele az "rm -rf ..."-es sort... azelott en meg azert ellenoriznek ezt-azt biztos. :)
- A hozzászóláshoz be kell jelentkezni
Ja, bocs, most latom csak, te letrehozas datuma alapjan akarsz rendezni. Rossz hir, hogy ez nincs altalaban eltarolva linuxos filerendszereken. Az enyem utolso modositas alapjan rendez.
- A hozzászóláshoz be kell jelentkezni
Jo es ezt is visszavonom a johans fenti hozzaszolasa alapjan. :) Azzal viszont nem ilyen egyszeru....
- A hozzászóláshoz be kell jelentkezni
Hasonlot kellene nekem is irni, de azzal a kulonbseggel hogy nem a legregebbit kell torolni, hanem az 1 honapnal regebbit. Es ha az adott konyvtarban mar csak az az egy torlendo fajl van akkor az utanamaradt ures konyvtarat is torolje.
-------------------
http://www.rtvstat.hu/ - A legtöbb magyar rádió és TV egy helyen!
- A hozzászóláshoz be kell jelentkezni
Ez az egyszerubb.
find . -type f -mtime +30 -delete
Ez kitorli a regi file-okat. Azert elotte "-delete" nelkul is probald ki. :)
Az ures konyvtar torlest meg egy "rmdir *" megoldja, az ugyis csak ures konyvtarat torol.
- A hozzászóláshoz be kell jelentkezni
Sziasztok!
Nem akartam új topikot nyitni, de ez is script és könyvtáras probléma.
Létre kell hoznom egy scripttel minden este egy olyan könyvtárat, aminek a neve a napi dátum.
Ezt elvileg így tudom megtenni:
datum=$(date +%Y"-"%m"-"%d)
mkdir /mnt/sda6/$datum
Létre is jön, ha soronként futtatom. Viszont ha fájlba szeretném menteni, hogy cron-nal tudjam ütemezni a parancsokat, akkor "invalid argument directory" hibát kapok. Mitől lehet ez?
A fájl csak ezeket a sorokat tartalmazza:
#!/bin/sh
datum=$(date +%Y"-"%m"-"%d)
mkdir /mnt/sda6/$datum
- A hozzászóláshoz be kell jelentkezni
Épp nincs linux a közelemben kipróbálni, de szerintem így jobb lesz:
datum=`date +"%Y-%m-%d"`
mkdir /mnt/sda6/$datum
de lehet így is megy a példád alapján:
datum=$(date +"%Y-%m-%d")
mkdir /mnt/sda6/$datum
- A hozzászóláshoz be kell jelentkezni
A crontabbal futtatott script nem feltétlen ugyan azokat a környezeti változókat kapja meg, mint a bejelentkezett user. Pl. a PATH lehet, hogy nem tartalmazza a `date' parancs könyvtárát. Próbáld meg teljes elérési úttal megadni a dolgokat, hátha.
- A hozzászóláshoz be kell jelentkezni
"Viszont ha fájlba szeretném menteni" Ugye ez nem azt jelenti, hogy miközben el akarod menteni a fájlt, akkor dob ilyen hibát? Mert nekem lefut, gond nélkül.
- A hozzászóláshoz be kell jelentkezni
Sziasztok!
Természetesen nem a mentéskor fut hibára.
Viszont sikerült megoldanom. Azt ugyan nem írtam az elején, hogy egy routeren szeretném futtatni mindezt, valószínűleg ez a gond.
A megoldás pedig az lett, hogy a router webes felületén lehet scripteket megadni, ütemezni, stb. Oda bemásoltam az eredeti kódot és minden fut rendesen.
Valószínűleg tényleg valami PATH hiány okozta a gondot, de mivel így jól működik, nem kísérleteztem vele.
Köszi mindenkinek!
- A hozzászóláshoz be kell jelentkezni