scrpit kérdés

Fórumok

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

Hozzászólások

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.

É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 fenti segítséghez egy másik ami kellhet.
man find

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.

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

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 :)

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...

Valami ilyen kellhet neked. Nem dolgoztam ki a végletekig:
find ./ -cmin -1200 -type d -ls

Vagy esetleg: ls -rtl

Linuxscripting


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. :)

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!

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

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!