Système d'exploitation: Linux
Type de système de fichiers: ext3
Solution préférée: bash (script / oneliner), ruby, python
J'ai plusieurs répertoires contenant plusieurs sous-répertoires et fichiers. J'ai besoin de faire une liste de tous ces répertoires qui est construite de manière à ce que chaque répertoire de premier niveau soit répertorié à côté de la date et de l'heure du dernier fichier créé / modifié.
Pour clarifier, si je touche un fichier ou modifie son contenu quelques niveaux de sous-répertoire vers le bas, cet horodatage doit être affiché à côté du nom du répertoire de premier niveau. Disons que j'ai un répertoire structuré comme ceci:
./alfa/beta/gamma/example.txt
et je modifie le contenu du fichier example.txt
, j'ai besoin de ce temps affiché à côté du répertoire de premier niveau alfa
sous une forme lisible par l'homme, pas l'époque. J'ai essayé certaines choses en utilisant find, et autres xargs
, sort
mais je ne peux pas contourner le problème selon lequel l'horodatage du système de fichiers 'alfa' ne change pas lorsque je crée / modifie des fichiers à quelques niveaux plus bas.
la source
Réponses:
Essaye celui-là:
Exécutez-le avec le chemin d'accès au répertoire où il doit commencer à analyser récursivement (il prend en charge les noms de fichiers avec des espaces).
S'il y a beaucoup de fichiers, cela peut prendre un certain temps avant de retourner quoi que ce soit. Les performances peuvent être améliorées si nous utilisons à la
xargs
place:ce qui est un peu plus rapide.
la source
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
Cela parvient toujours à être rapide pour moi.brew install coreutils
et utilisergstat
au lieu destat
stat
carfind PATH -type f -printf "%T@ %p\n"| sort -nr
le travail est fait. C'est aussi un peu plus rapide de cette façon.find PATH -type f -exec stat -f "%m %N" "{}" \; | sort -nr | head
Pour rechercher tous les fichiers dont l'état du fichier a été modifié pour la dernière fois il y a N minutes:
find -cmin -N
par exemple:
find -cmin -5
la source
sudo find -cmin -1 2>&1 |grep -v /proc/
GNU Find (voir
man find
) a un-printf
paramètre pour déplacer les fichiers EPOC mtime et le nom de chemin relatif.la source
tail
pour empêcher l'impression de milliers de lignes dans la sortie.awk '{print $2}'
partie semble poser problème quand il y a des noms de fichiers avec des espaces. Voici une solution utilisant à lased
place, et ellefind . -type f -printf '%T@ %Tc %P\n' | sort -n | tail | sed -r 's/^.{22}//'
touch "lala<Enter>b"
pour créer un tel fichier. Je pense que la conception des utilitaires unix a un gros défaut sur le nom de fichier.J'ai raccourci la réponse impressionnante de halo à ce one-liner
Mise à jour : s'il y a des espaces dans les noms de fichiers, vous pouvez utiliser cette modification
la source
IFS=$'\n'
n'est en aucun cas sûr lors de la gestion des noms de fichiers: les retours à la ligne sont des caractères valides dans les noms de fichiers sous UNIX. Seul le caractère NUL est garanti de ne pas être présent dans un chemin.Essaye ça
Il permet
find
de rassembler tous les fichiers du répertoire,ls
de les lister triés par date de modification,head
de sélectionner le 1er fichier et enfinstat
d'afficher l'heure dans un joli format.À l'heure actuelle, il n'est pas sûr pour les fichiers contenant des espaces ou d'autres caractères spéciaux dans leurs noms. Écrivez un éloge s'il ne répond pas encore à vos besoins.
la source
Cette commande fonctionne sur Mac OS X:
find "$1" -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
Sous Linux, comme l'a demandé l'affiche originale, utilisez
stat
plutôtgstat
.Cette réponse est, bien sûr, la solution exceptionnelle de user37078 , promue du commentaire à la réponse complète. J'ai mélangé la perspicacité de CharlesB à utiliser
gstat
sur Mac OS X. J'ai d'ailleurs obtenu des coreutils de MacPorts plutôt que de homebrew .Et voici comment j'ai empaqueté ceci dans une commande simple
~/bin/ls-recent.sh
pour la réutilisation:la source
~/bin/ls-recent.sh
, avez-vous soigneusement vérifié les différences dans le script?find . -exec stat -f '%m%t%Sm %N' {} + | sort -n | cut -f2-
Les solutions Perl et Python de cet article m'ont aidé à résoudre ce problème sur Mac OS X: /unix/9247/how-to-list-files-sorted-by-modification-date-recursively -no-stat-command-avail .
Citant de la poste:
Perl:
Python:
la source
Ignorer les fichiers cachés - avec un horodatage agréable et rapide
Gère bien les espaces dans les noms de fichiers - pas que vous devez les utiliser!
Plus à
find
gogo peut être trouvé en suivant le lien.la source
Je montre ceci pour le dernier temps d'accès, vous pouvez facilement le modifier pour faire le dernier temps de mod.
Il y a deux façons de procéder:
1) Si vous voulez éviter le tri global qui peut coûter cher si vous avez des dizaines de millions de fichiers, alors vous pouvez faire: (positionnez-vous à la racine du répertoire où vous souhaitez que votre recherche démarre)
La méthode ci-dessus imprime les noms de fichiers avec un temps d'accès progressivement plus récent et le dernier fichier qu'elle imprime est le fichier avec le dernier temps d'accès. Vous pouvez évidemment obtenir le dernier temps d'accès en utilisant un "tail -1".
2) Vous pouvez avoir à rechercher récursivement le nom, l'heure d'accès de tous les fichiers de votre sous-répertoire, puis trier en fonction de l'heure d'accès et de la queue la plus grande entrée:
Et voila...
la source
J'ai cet alias dans mon .profile que j'utilise assez souvent
Donc, il fait ce que vous recherchez (à l'exception qu'il ne traverse pas plusieurs niveaux de changement de date / heure) - recherche les derniers fichiers (fichiers * .log et * .trc dans ce cas); De plus, il ne trouve que les fichiers modifiés le dernier jour, puis les trie par heure et les tuyaux sortent par moins:
ps. Remarquez que je n'ai pas de racine sur certains serveurs, mais que j'ai toujours sudo, donc vous n'aurez peut-être pas besoin de cette partie.
la source
Vous pouvez donner la commande printf de trouver un essai
la source
Fonction bash rapide:
Recherchez le dernier fichier modifié dans un répertoire:
Vous pouvez également spécifier votre propre format de date / heure comme troisième argument.
la source
Ce qui suit vous renvoie une chaîne d'horodatage et le nom du fichier avec l'horodatage le plus récent:
Résultat d'une sortie du formulaire:
<yy-mm-dd-hh-mm-ss.nanosec> <filename>
la source
Voici une version qui fonctionne avec des noms de fichiers qui peuvent également contenir des espaces, des sauts de ligne, des caractères globaux:
find ... -printf
imprime la modification de fichier (valeur EPOCH) suivie d'un espace et de\0
noms de fichiers terminés.sort -zk1nr
lit les données terminées NUL et les trie numériquementComme la question est balisée avec Linux, je suppose que des
gnu
utilitaires sont disponibles.Vous pouvez pipe ci-dessus avec:
pour imprimer l'heure de modification et les noms de fichiers triés par heure de modification (la plus récente en premier) terminée par des retours à la ligne.
la source
Voici ce que j'utilise (très efficace):
AVANTAGES:
USAGE:
où:
dir
- un répertoire à rechercher [répertoire actuel]number
- nombre de fichiers les plus récents à afficher [10]La sortie pour
find_last /etc 4
ressemble à ceci:la source
Pour une
ls
sortie simple , utilisez ceci. Il n'y a pas de liste d'arguments, donc ça ne peut pas être trop long:Et gentiment avec
cut
juste pour les dates, les heures et le nom:EDIT : Je viens de remarquer que la première réponse actuelle est triée par date de modification. C'est tout aussi simple avec le deuxième exemple ici, car la date de modification est la première sur chaque ligne - claquez un tri à la fin:
la source
Cela pourrait être fait avec une fonction récursive dans bash aussi
Soit F une fonction qui affiche l'heure du fichier qui doit être triable lexicographiquement aaaa-mm-jj etc., (dépendant du système d'exploitation?)
R la fonction récursive qui traverse les répertoires
et enfin
la source