Page 1 sur 1

[Shell] Date modification contenue d'un repertoire (résolue)

Publié : dim. 13 nov. 2016, 19:33
par Niidhogg
Bonjour,

Juste une question rapide dont je ne trouves pas de réponse sur moteur de recherche: Es qu'il existe un moyen de connaitre la date de dernière modification du contenue d'un répertoire sans avoir à parcourir tout le répertoire(trop long), en gros la date de modification du dernier fichier modifié dans le répertoire ?

Re: [Shell] Date modification contenue d'un repertoire

Publié : dim. 13 nov. 2016, 19:46
par benjarobin
Bonjour, via une recherche rapide j'ai trouvé ceci : http://stackoverflow.com/questions/5566 ... ory-with-s

Re: [Shell] Date modification contenue d'un repertoire

Publié : dim. 13 nov. 2016, 19:54
par lemust83
Bonsoir.
Il y a aussi tout simplement la commande stat <nom_du_fichier> qui donne ce genre de renseignements.

Re: [Shell] Date modification contenue d'un repertoire

Publié : dim. 13 nov. 2016, 20:46
par Niidhogg
Oui, ok, mais je cherche une méthode qui ne m'impose pas à parcourir tout les fichiers du répertoire mais seulement les répertoires, sinon ce serrait beaucoup trop long, c'est des milliers de fichier pour une application web, donc je ne peut pas me le permettre...
stat renvoie bien st_mtime mais d'après la doc: "Moreover, st_mtime of a directory is changed by the creation or deletion of files in that directory. The st_mtime field is not changed for changes in owner, group, hard link count, or mode." Au pire je me rebattrais exclusivement sur la création d'un nouveau fichier, mais si quelqu'un a une solution pour la modification d'un fichier du répertoire sans regarder chaque fichier exclusivement, ou alors la preuve que ce n'est pas possible ?

Re: [Shell] Date modification contenue d'un repertoire

Publié : dim. 13 nov. 2016, 21:09
par benjarobin
Ce n'est pas possible (enfin tu es obligé de parcourir récursivement les dossiers), la preuve, je n'en ai pas, à part que c'est logique.
Tu peux en effet, je pense, te baser sur uniquement la date de modification du dossier, et donc tu n'as besoin de parcourir que les dossiers.
Et c'est très rapide de trouver ce que tu veux si tu le code intégralement en python, ne le code pas en bash cela sera bien plus long...

Re: [Shell] Date modification contenue d'un repertoire

Publié : dim. 13 nov. 2016, 21:28
par Niidhogg
Ok, ca me conviens comme réponse, merci :p

Re: [Shell] Date modification contenue d'un repertoire (résolue)

Publié : dim. 13 nov. 2016, 21:33
par benjarobin
Voici un exemple de script en python3 (je ne sais pas s'il a moyen de le coder plus efficacement en python3, je suis plutôt un développeur C bas niveau :-) ) :

Code : Tout sélectionner

import os
import time

dirScan = '.'

newestDirTime = 0;
newestDirPath = '';

for x in os.fwalk(dirScan):
    statInfo = os.fstat(x[3])
    if statInfo.st_mtime > newestDirTime:
        newestDirPath = x[0]
        newestDirTime = statInfo.st_mtime

print(newestDirPath)
print(time.strftime("%Y/%m/%d %H:%M:%S",time.localtime(newestDirTime)))
Une autre version:

Code : Tout sélectionner

import os
import time

dirScan = '.'

newestDirTime = 0;
newestDirPath = '';

def findNewestDir(d):
    global newestDirTime, newestDirPath
    statInfo = os.stat(d)
    if statInfo.st_mtime > newestDirTime:
        newestDirPath = d
        newestDirTime = statInfo.st_mtime
    for x in os.listdir(d):
        x = os.path.join(d,x)
        if os.path.isdir(x):
            findNewestDir(x)

findNewestDir(dirScan)
print(newestDirPath)
print(time.strftime("%Y/%m/%d %H:%M:%S",time.localtime(newestDirTime)))
Et puis en C pour aller vraiment plus vite (ici on vérifie même la date des fichiers => Plus rapide et plus fiable) :

Code : Tout sélectionner

#define _XOPEN_SOURCE 700

#include <stdlib.h>
#include <unistd.h>
#include <ftw.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

static time_t newestDirTime = 0;

int search_in_entry(const char *filepath, const struct stat *info,
                const int typeflag, struct FTW *pathinfo)
{
    if (info->st_mtime > newestDirTime)
    {
        newestDirTime = info->st_mtime;
    }

    return 0;
}


int search_newest_file(const char *const dirpath)
{
    /* Invalid directory path? */
    if (dirpath == NULL || *dirpath == '\0')
        return -1;

    return nftw(dirpath, search_in_entry, 15, FTW_PHYS);
}

int main(int argc, char *argv[])
{
    int i;
    char buffer[64];

    if (argc < 2) {

        if (search_newest_file(".")) {
            fprintf(stderr, "%s.\n", strerror(errno));
            return EXIT_FAILURE;
        }

    } else {

        for (i = 1; i < argc; i++) {
            if (search_newest_file(argv[i])) {
                fprintf(stderr, "%s.\n", strerror(errno));
                return EXIT_FAILURE;
            }
        }
    }

    strftime(buffer, 64, "%Y:%m:%d %H:%M:%S", localtime(&newestDirTime));

    printf("%lu : %s\n", newestDirTime, buffer);

    return EXIT_SUCCESS;
}

Re: [Shell] Date modification contenue d'un repertoire (résolue)

Publié : mer. 16 nov. 2016, 11:05
par RoyalPanda
Sinon, en prenant le problème autrement, tu peux surveiller toutes les modifications du FS sur un répertoire donné.
1 exemple la : http://reflexioninformatique.fr/surveil ... rotection/