Comment puis-je trouver le nouveau fichier créé dans un répertoire?
Est-il un moyen élégant en Perl pour trouver le nouveau fichier dans un répertoire (les plus récentes par date de modification)?
Ce que j'ai jusqu'à présent est à la recherche pour les fichiers dont j'ai besoin, et pour chacun d'obtenir la modification du temps, poussez-le dans un tableau contenant le nom de fichier, date de modification, puis de les trier.
Il doit y avoir une meilleure façon.
Vous devez vous connecter pour publier un commentaire.
Est votre façon de faire de la "bonne" façon si vous avez besoin d'une liste triée (et pas seulement la première, voir Brian de réponse pour ça). Si vous n'avez pas envie de vous écrire ce code vous-même, utilisez cette
Personnellement, je n'irais pas avec le
ls -t
de la méthode qui consiste à faire un fork d'un autre programme et il n'est pas portable. À peine ce que j'appellerais "l'élégante"!Concernant rjray la solution de la main codé solution, j'aimerais changer un peu:
Après cela,
@sorted_files
contient la liste triée, où l'0e élément est le plus récent fichier, et chaque élément lui-même contient une référence aux résultats destat
, avec le nom de fichier lui-même dans le dernier élément:L'avantage de cela est qu'il est plus facile de changer la méthode de tri plus tard, si vous le souhaitez.
EDIT: voici un facile à lire (mais plus long) version du répertoire de numérisation, ce qui garantit la plaine des fichiers sont ajoutés à la liste:
NB: le test pour
defined()
sur le résultat dereaddir()
est parce qu'un fichier appelé '0' serait la cause de la boucle à l'échec si vous testez uniquementif (my $file = readdir($DH))
File::DirList
etls
nécessite l'installation (sous Windows au moins). `@l = File::DirList::list('.', 'M'); say $l[0][0][13]
Note de la capitale M.File::DirList::list
etls -t
le retour à la fois les noms de fichiers et de dirnames.Vous n'avez pas besoin de conserver toutes les modifications et les noms de fichiers dans une liste, et vous ne devriez probablement pas. Tout ce que vous devez faire est de regarder un fichier et de voir si il est plus vieux que le plus vieux que vous avez vu précédemment:
$newest_time
est automatiquement initialisée à 0,-M $path
ne peut jamais être moins. Vous pouvez l'initialiser comme ceci:$newest_time = 2**31 - 1
-M
est négatif lorsque le fichier est modifié après le démarrage du programme. Je doit définir le nouveau temps si elle n'est pas encore défini. $newest_time n'est pas automatiquement initialisées à zéro: il est converti à 0 si il est pas défini et je l'utilise numériquement (comme dans le<
opérateur). Vous ne voulez pas affectez-lui une valeur magique non plus. Vous voulez avoir l'absence de valeur jusqu'à ce que vous avez une véritable. 🙂vous pouvez essayer d'utiliser le shell
ls
commande:ls -t
renvoie les deux fichier et directory noms.En supposant que vous savez le
$DIR
vous voulez regarder dans:La
grep
qui enveloppe lereaddir
filtre le "." et ".." spécial fichiers UNIX(-ish) système de fichiers.Si vous ne pouvez pas laisser
ls
faire le tri pour vous que @Nathan suggère, alors vous pouvez optimiser vos processus en ne gardant que la dernière date de modification et le nom de fichier associée vu jusqu'à présent et de le remplacer à chaque fois que vous trouver un nouveau fichier dans le répertoire. Pas besoin de garder tous les fichiers que vous connaissez sont plus vieux que le plus récent que vous avez vu jusqu'à présent et certainement pas besoin de les trier puisque vous pouvez détecter qui est la plus récente lors de la lecture de l'annuaire.Sujet est vieux, mais peut-être que quelqu'un va essayer il - il n'est pas portable (systèmes de type Unix seulement), mais c'est très simple et fonctionne:
ls
. Perl est bien équipé pour gérer la problématique des cas limites (les noms de fichiers avec des sauts de ligne, etc).