2009-09-10 3 views
19

os.stat renvoie les attributs st_mtime et st_ctime, l'heure de modification est st_mtime et st_ctime "change time" sur POSIX. Y at-il une fonction qui retourne l'heure de création d'un fichier en utilisant python et sous Linux?Obtenir le temps de création de fichier avec Python sous Linux

+0

Cela a fonctionné pour moi: http://stackoverflow.com/a/947239/4535020 – Tbb

+1

Attend cela dépend de ce système de fichiers que vous utilisez: http://unix.stackexchange.com/questions/7562/what -file-systems-on-linux-store-the-creation-time – CSJ

Répondre

25

You probablycan't.:

3,1) Comment puis-je trouver le temps de création d'un fichier?

Vous ne pouvez pas - il n'est stocké nulle part. Les fichiers ont un temps modifié en dernier (indiqué par "ls -l"), un temps accédé en dernier (indiqué par "ls -lu") et un temps de changement d'inode (indiqué par "ls -l"). Ce dernier est souvent appelé "temps de création" - même dans certaines pages de manuel - mais c'est faux; Il est également défini par des opérations telles que mv, ln, chmod, chown et chgrp.

La page de manuel de "stat (2)" en traite.

+0

Y a-t-il une commande pour trouver l'heure et la date de création d'un fichier sous Linux Si stat ne le fait pas? –

+5

En général, les systèmes de fichiers UNIX ne stockent pas du tout l'heure de création - il n'existe aucune méthode pour extraire des données qui n'ont jamais été écrites sur le disque en premier lieu. – ephemient

13

essayer:

st_birthtime 

Il nest pas » garantie d'être disponible sur tous les systèmes bien. A partir de la documentation:

Sur certains systèmes Unix (comme Linux), les attributs suivants peuvent également être disponibles: st_blocks (nombre de blocs alloués pour le fichier), st_blksize (système de fichiers blocksize), st_rdev (tapez du périphérique si un périphérique inode). st_flags (drapeaux définis par l'utilisateur pour le fichier ).

Sur d'autres systèmes Unix (tels que FreeBSD), les attributs suivants peuvent être disponibles (mais peuvent seulement être rempli si root essaie de les utiliser): st_gen (numéro de génération de fichiers), st_birthtime (temps de création de fichier).

http://docs.python.org/2/library/os.html#os.stat

1

Vous pourriez expliquer pourquoi vous voulez faire.

Une solution indirecte pourrait être d'utiliser un système revision control (un système de contrôle de version = VCS) pour gérer les fichiers dont le temps de naissance est nécessaire.

Vous pouvez donc utiliser git sur de tels fichiers (c'est-à-dire les gérer comme "code source"). Ensuite, vous savez non seulement quand ils ont été créés (en fait enregistré dans le VCS en utilisant git add), mais pourquoi, par qui, quoi, etc ... Utilisez git log pour obtenir tout cela ...

Bien sûr, vous besoin d'une certaine façon d'éduquer vos utilisateurs d'utiliser un VCS comme git

1

Selon un fil hereHFS et NTFS de Microsoft de OS X également suivre à la fois le temps de naissance, et je me dit l'OS X et versions Cygwin de stat() renvoie cette information. qui regardant le osx stat manpage semble correct au moins pour mac:

a, m, c, B

Le fichier temps dernier accès ou modifié, quand l'inode a été changée ou le le temps de naissance de l'inode.

Pour les systèmes de fichiers Linux plus récents comme ext4, Btrfs et JFS faire soutenir cela en utilisant debugfs, il y a une fonction bash prise de here qui va extraire l'horodatage créé date:

Vous pouvez récupérer le fichier date de création si vous traitez avec système de fichiers capable comme EXT4 - système de fichiers journalisé pour Linux:

horodatages Amélioration

... Ext4 fournit des horodateurs mesurés en nanosecondes. En outre, ext4 ajoute également la prise en charge des horodatages créés par date. Mais il n'y a pas de consensus dans la communauté sur ce point

... comme le souligne Theodore Ts'o, alors qu'il est facile d'ajouter un champ de date de création supplémentaire dans l'inode (permettant ainsi le support technique pour la date créée timestamps dans ext4), il est plus difficile de modifier ou d'ajouter les appels système nécessaires, comme stat() (qui nécessiterait probablement une nouvelle version) et les différentes bibliothèques qui en dépendent (comme glibc). Ces changements nécessiteraient la coordination de nombreux projets. Ainsi, même si les développeurs ext4 implémentent la prise en charge initiale des horodatages de date de création, cette fonctionnalité ne sera pas disponible pour les programmes utilisateur pour le moment. Qui se retrouvent avec la cotation finale Linus

Attendons cinq ans et voyons s'il y a un consensus sur le fait que cela soit nécessaire et utilisé du tout, plutôt que de se précipiter dans quelque chose juste parce que "nous pouvons".

xstat() { 
    for target in "${@}"; do 
    inode=$(ls -di "${target}" | cut -d ' ' -f 1) 
    fs=$(df "${target}" | tail -1 | awk '{print $1}') 
    crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
    grep -oP 'crtime.*--\s*\K.*') 
    printf "%s\t%s\n" "${crtime}" "${target}" 
    done 
} 

L'exécution retourne la date de création:

:~$ echo 'print("hello world")' > blah.py 
:~$ xstat "blah.py" 
Mon Jul 6 13:43:39 2015 blah.py 
:~$ echo 'print("goodbye world")' > blah.py 
:~$ xstat "blah.py" 
Mon Jul 6 13:43:39 2015 blah.py 

Donc, à moins que le système de fichiers prend en charge alors il est impossible, si le système de fichiers ne vous pouvez alors exécuter le debugfs en utilisant le sous-processus et analyser la sortie.

0

Certains systèmes de fichiers prennent en charge l'enregistrement de l'heure de naissance, mais Linux ne fournit pas d'interface pour l'obtenir.

Voir http://lwn.net/Articles/397442/

Si l'on atempts d'utiliser la "stat" commande pour l'obtenir: % stat -c% p {fichier ou dir}

Le résultat sera un "-" en raison de il n'a pas la capacité de le récupérer. Cependant, on peut utiliser cette méthode d'échantillonnage en utilisant debugfs avec xStat pour le récupérer (en fournissant à nouveau, que le système de fichiers utilisé supports collectant.)

https://gist.github.com/moiseevigor/8c496f632137605b322e

xstat() { 
    for target in "${@}"; do 
    inode=$(ls -di "${target}" | cut -d ' ' -f 1) 
    fs=$(df "${target}" | tail -1 | awk '{print $1}') 
    crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
    grep -oP 'crtime.*--\s*\K.*') 
    printf "%s\t%s\n" "${crtime}" "${target}" 
    done 
} 

Remarque cela nécessite sudo.

0

Que voulez-vous dire qu'il ne peut pas être fait [1]? La fonction,

os.stat(path).st_birthtime
, fonctionne très bien.

 
[1]: 
Somebody said that it couldn’t be done 
     But he with a chuckle replied 
That “maybe it couldn’t,” but he would be one 
     Who wouldn’t say so till he’d tried. 
So he buckled right in with the trace of a grin 
     On his face. If he worried he hid it. 
He started to sing as he tackled the thing 
     That couldn’t be done, and he did it! 
-- Edgar Albert Guest 
+0

Qu'est-ce que c'est? Votre réponse est confuse. – Billa

Questions connexes