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

Ce qui ne concerne ni le forum ni des problèmes
Niidhogg
newbie
Messages : 9
Inscription : mar. 08 avr. 2014, 21:15

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

Message 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 ?
Dernière modification par Niidhogg le dim. 13 nov. 2016, 21:28, modifié 1 fois.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

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

Message par benjarobin »

Bonjour, via une recherche rapide j'ai trouvé ceci : http://stackoverflow.com/questions/5566 ... ory-with-s
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
lemust83
yeomen
Messages : 206
Inscription : ven. 11 déc. 2015, 21:20

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

Message par lemust83 »

Bonsoir.
Il y a aussi tout simplement la commande stat <nom_du_fichier> qui donne ce genre de renseignements.
Tour: Arch (Xfce) 64 Testing: 6-Core: AMD Ryzen 5 2600X type: MT MCP speed: 2152 MHz min/max: 2200/3600 MH
UEFI: American Megatrends v: 3803 date: 01/22/2018
Graphics:
Device-1: AMD Baffin [Radeon RX 460/560D / Pro
450/455/460/555/555X/560/560X]
driver: amdgpu v: kernel
Display: server: X.Org 1.20.8 driver: amdgpu,ati unloaded: modesetting
resolution: 1920x1080~60Hz
OpenGL: renderer: Radeon RX 560 Series
Manjaro en Dual (grub).
Niidhogg
newbie
Messages : 9
Inscription : mar. 08 avr. 2014, 21:15

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

Message 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 ?
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

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

Message 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...
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Niidhogg
newbie
Messages : 9
Inscription : mar. 08 avr. 2014, 21:15

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

Message par Niidhogg »

Ok, ca me conviens comme réponse, merci :p
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

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

Message 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;
}
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
RoyalPanda
yeomen
Messages : 239
Inscription : lun. 19 mai 2014, 09:08

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

Message 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/
Répondre