Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[shell] trouver les fichiers les plus recents

15 réponses
Avatar
Nicolas.MICHEL
Bonjour

Je cherche un truc pour dater mes dossiers.
Sauf qu'un dossier peut avoir une date plus vielle que les fichiers
qu'il contient.
Je me demande donc comment chercher dans un dossier donné quels sont les
fichiers les plus récents.

J'ai tenté un find -mtime, mais il faut alors chercher mtime -1, puis
mtime -2, ... sinon j'avais pensé un ls -lR, mais il faut après faire le
tri... Bref je suppose qu'il y a un truc :)

Merci d'avance
--
S'il n'y a pas de solutions, c'est qu'il n'y a pas de problèmes
iChat/AIM : michelnicolas

10 réponses

1 2
Avatar
Nicolas George
Nicolas MICHEL wrote in message
<1gx4dem.yucm3w1bd680cN%:
Je cherche un truc pour dater mes dossiers.
Sauf qu'un dossier peut avoir une date plus vielle que les fichiers
qu'il contient.
Je me demande donc comment chercher dans un dossier donné quels sont les
fichiers les plus récents.

J'ai tenté un find -mtime, mais il faut alors chercher mtime -1, puis
mtime -2, ... sinon j'avais pensé un ls -lR, mais il faut après faire le
tri... Bref je suppose qu'il y a un truc :)


Il y a l'option -t de ls pour trier par date de dernière modification.
Sinon, avec zsh, « *(ot) » se développer en la liste des fichiers (et
répertoires) par ordre de modification, et « *(om[1]) » se développe en le
fichier (ou répertoire) le plus récemment modifié ; on peut utiliser oc pour
utiliser le ctime plutôt que le mtime.

Avatar
Nicolas.MICHEL
Nicolas George <nicolas$ wrote:

Il y a l'option -t de ls pour trier par date de dernière modification.


Effectivement, mais il ne se combine pas avec l'option ls -R, donc un
dossier plus vieux contennant un fichie plus récent aparaitra après.

Sinon, avec zsh, « *(ot) » se développer en la liste des fichiers (et
répertoires) par ordre de modification, et « *(om[1]) » se développe en le
fichier (ou répertoire) le plus récemment modifié ; on peut utiliser oc pour
utiliser le ctime plutôt que le mtime.


Ah, bon, après un peu de mal j'ai finit par trouver ça :
http://www.rayninfo.co.uk/tips/zshtips.html
Qui me donne une idée de ce que tu m'explique.
Mais le résultat ne semble pas cohérent, je ne comprends pas ce qui se
passe au juste.

par ex. la commande
ls *(om[1])
me sort plusieurs résultats, alors que c'est sencé n'en sortir qu'un, si
je sais lire.

ls -l **/*(om[1])
parce que ça a l'air plus proche de ce que je veux, mais logiquement
ls -l **/*(om[1,3])
devrait me sortir 3 résultats, ce qui n'est pas le cas. ?

Merci beaucoup :)
--
S'il n'y a pas de solutions, c'est qu'il n'y a pas de problèmes
iChat/AIM : michelnicolas

Avatar
Nicolas George
Nicolas MICHEL wrote in message
<1gx4f8f.a8um8tnw8luaN%:
ls *(om[1])
me sort plusieurs résultats, alors que c'est sencé n'en sortir qu'un, si
je sais lire.


Essaie avec ls -d, ou bien avec *(.om[1]) : l'un affiche les répertoire
comme des répertoires et pas leur contenu, l'autre ne liste que les fichiers
réguliers.

Avatar
Fred
Nicolas George <nicolas$ wrote:


Il y a l'option -t de ls pour trier par date de dernière modification.



Effectivement, mais il ne se combine pas avec l'option ls -R, donc un
dossier plus vieux contennant un fichie plus récent aparaitra après.


Sinon, avec zsh, « *(ot) » se développer en la liste des fichiers (et
répertoires) par ordre de modification, et « *(om[1]) » se développe en le
fichier (ou répertoire) le plus récemment modifié ; on peut utiliser oc pour
utiliser le ctime plutôt que le mtime.



Ah, bon, après un peu de mal j'ai finit par trouver ça :
http://www.rayninfo.co.uk/tips/zshtips.html
Qui me donne une idée de ce que tu m'explique.
Mais le résultat ne semble pas cohérent, je ne comprends pas ce qui se
passe au juste.

par ex. la commande
ls *(om[1])
me sort plusieurs résultats, alors que c'est sencé n'en sortir qu'un, si
je sais lire.

ls -l **/*(om[1])
parce que ça a l'air plus proche de ce que je veux, mais logiquement
ls -l **/*(om[1,3])
devrait me sortir 3 résultats, ce qui n'est pas le cas. ?

Merci beaucoup :)


Je crois que tu auras plus vite fait d'écrire cette commande en C.

Fred


Avatar
Nicolas.MICHEL
Fred wrote:

Je crois que tu auras plus vite fait d'écrire cette commande en C.


C possible, en effêt, pour qui pratique le C.

Par contre je pratique le shell. Et pour ce cas précis, le zsh semble
bien supérieur aux autres shell, pour autant qu'on comprennent ses
options et fonctions... D'où ma question.
Notez que si vous avez un lien vers un tutorial ou truc du genre, je
suis prenneur.

Merci :)
--
S'il n'y a pas de solutions, c'est qu'il n'y a pas de problèmes
iChat/AIM : michelnicolas

Avatar
Pascal Bourguignon
(Nicolas MICHEL) writes:

Bonjour

Je cherche un truc pour dater mes dossiers.
Sauf qu'un dossier peut avoir une date plus vielle que les fichiers
qu'il contient.
Je me demande donc comment chercher dans un dossier donné quels sont les
fichiers les plus récents.

J'ai tenté un find -mtime, mais il faut alors chercher mtime -1, puis
mtime -2, ... sinon j'avais pensé un ls -lR, mais il faut après faire le
tri... Bref je suppose qu'il y a un truc :)

Merci d'avance


1- unix ne mémorise pas la date de création.

2- quand on modifie un fichier, on ne modifie pas le répertoire dans
lequel il se trouve.

Tu n'y coupe pas, si tu veux savoir quel est le fichier modifié en
dernier ("le plus récent"), il faut comparer sa date de modification
avec celles de tous les autres. Si tu dois le faire de façon
récursive, gnu find est le mieux (car il ne triera pas inutilement les
fichiers).

$ find . -type f -printf "%TY%Tm%Td %TT %pn" 2>/dev/null|sort -r|head -1
20050525 17:03:08 ./asf4Z35ta

--
__Pascal Bourguignon__ http://www.informatimago.com/

Avatar
Nicolas.MICHEL
Pascal Bourguignon wrote:

$ find . -type f -printf "%TY%Tm%Td %TT %pn" 2>/dev/null|sort -r|head -1
20050525 17:03:08 ./asf4Z35ta


Super !
J'ai trouvé le binaire de gnufind pour mac et ça marche comme attendu.

Merci Pascal :)
--
S'il n'y a pas de solutions, c'est qu'il n'y a pas de problèmes
iChat/AIM : michelnicolas

Avatar
Laurent Wacrenier
Nicolas MICHEL écrit:
Je me demande donc comment chercher dans un dossier donné quels sont les
fichiers les plus récents.


S'il n'y a pas trop de fichiers :

find . -type f -print | xargs ls -t | head

Avatar
Nicolas.MICHEL
Laurent Wacrenier wrote:

Nicolas MICHEL écrit:
Je me demande donc comment chercher dans un dossier donné quels sont les
fichiers les plus récents.


S'il n'y a pas trop de fichiers :

find . -type f -print | xargs ls -t | head


Ah, bin selon ce que j'ai testé ça ne passe pas avec les nom comportants
des espaces.
ça ne serait pas plutôt ceci :
find . -type f -print0 |xargs -0 ls -t | head

A propos du "trop grand nombre de fichiers", on peut dans ce cas faire :

find . -type f -fprintf /tmp/findtemp "%TY%Tm%Td %TT %pn" 2>/dev/null
sort -o /tmp/sorttemp -r /temp/findtemp
head /tmp/sorttemp
rm /tmp/sorttemp /tmp/findtemp

non ?
(à moins que la méthode de Pascal soit à l'abris de mes 800'000
fichiers, ce dont je doutes)


--
S'il n'y a pas de solutions, c'est qu'il n'y a pas de problèmes
iChat/AIM : michelnicolas


Avatar
Nicolas George
Nicolas MICHEL wrote in message
<1gx7rec.332cuqvwrwvkN%:
A propos du "trop grand nombre de fichiers", on peut dans ce cas faire :

find . -type f -fprintf /tmp/findtemp "%TY%Tm%Td %TT %pn" 2>/dev/null
sort -o /tmp/sorttemp -r /temp/findtemp
head /tmp/sorttemp
rm /tmp/sorttemp /tmp/findtemp

non ?
(à moins que la méthode de Pascal soit à l'abris de mes 800'000
fichiers, ce dont je doutes)


C'est exactement la même méthode, sauf que la communication entre find et
sort se fait avec un pipe (et sort se débrouille pour créer des fichiers
temporaires s'il estime en avoir besoin) plutôt qu'avec des fichiers
temporaires (au nom prévisible dans un répertoire public : à exclure
absolument dans des scripts en production s'il y a des utilisateurs
potentiellement hostiles).

1 2