Directory Modify Time

Fórumok

Scriptes megoldással kell megkeresnem egy könyvtárban lévő legrégebben módosított könyvtárat, majd abból törölni a legrégebben módosított állományt. Meg is találom és törlöm a megfelelő fájlt, melynek következtében a tartalmazó könyvtár módosítási ideje aktualizálódik, ezért a script következő futásakor már nem "ezt" a könyvtárat ítéli majd legrégebben módosítottnak. Gondoltam, törlés előtt stat-tal lekérem a könyvtár aktuális mtime értékét, majd törlés után touch segítségével visszaállítom azt. A gond, hogy bármit állítok be touch segítségével, a stat nem a beállított értéket mutatja, hanem frissebbet. Ls vagy mc a beállítottat hozza. A stat busybox-os. A teszt script:


DIR="/usr/test"
res=$(ls -tr1 ${DIR} | head -n 1)
if [ -d ${DIR}/$res ]; then
    res2=$(ls -tr1 ${DIR}/$res | head -n 1)
    if [ -n "$res2" ]; then
	st=$(stat ${DIR}/$res | grep "Modify")
	t=$(echo $st | cut -d ' ' -f 3)
	dt="$(echo $st | cut -d ' ' -f 2) ${t%.*}"
	if [ -e ${DIR}/$res/$res2 ]; then
	    rm -rf ${DIR}/$res/$res2; [ $? -eq 0 ] && touch -d "$dt" ${DIR}/$res
	fi
    fi
fi

Mit rontok el, mivel nem vagyok tisztában?

Kösz!

--------------------------
Szerk: a busybox-os (1.15.3) coreutils/stat.c bugos. Írtam egy saját utilt, azzal minden oké.

Hozzászólások

A vége egy fapados getmodtime lett a stat.c folt helyett, miután a busybox-os touch -d-vel is gondok voltak.

a minimal gmt.c


int main(int argc, char *argv[]) {
	extern char *optarg;
	struct stat statbuf;
	struct tm *mtime;
	char *tf = NULL;
	char buf[200];
	int c;

	while ( (c=getopt(argc,argv,"i:")) != -1 )
		if (c == 'i') tf=optarg;

	if (!tf || stat(tf, &statbuf)) exit(EXIT_FAILURE);

	mtime=localtime((time_t *)&statbuf.st_mtime);
	if (strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", mtime) == 0) exit(EXIT_FAILURE);

	printf("%s\n",buf);

  return 0;

}

és a teszt script:


DIR="/usr/test"
res=$(ls -tr1 ${DIR} | head -n 1)
if [ -d ${DIR}/$res ]; then
    res2=$(ls -tr1 ${DIR}/$res | head -n 1)
    if [ -n "$res2" ]; then
	st=$(gmt -i ${DIR}/$res)
	if [ -n "$st" -a -e ${DIR}/$res/$res2 ]; then
	    rm -rf ${DIR}/$res/$res2 && touch -d "$st" ${DIR}/$res
        fi
    fi
fi

-------
A formázás megeszi a '< >' és '&&_{' (_ helyett szóköz) szövegeket. Milyen formázást kell állítanom, hogy ne vágja ki?