OVH Cloud OVH Cloud

[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

5 réponses

1 2
Avatar
Pascal Bourguignon
(Nicolas MICHEL) writes:
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)


Il n'y a aucun problème à passer 800000 lignes via un pipe.
ON N'EST PAS SUR MS-DOS!



Mais si tu as des espaces dans tes noms de fichiers, sache que nos
méthodes ne fonctionneront pas s'ils ont aussi des new-line!


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

The world will now reboot. don't bother saving your artefacts.



Avatar
Nicolas.MICHEL
Nicolas George <nicolas$ wrote:

C'est exactement la même méthode, sauf que la communication entre find et
sort se fait avec un pipe


Oui, mais quelle est la limite de taille d'une pipe ?

J'ai ici un vieux bouquin qui dit, euh, je ne l'ai pas sous la main en
fait. Mais j'ai déjà eu des "find ... |xargs" qui partaient aux fraises
à cause d'un résultat trop long il me semble. Je ne sais par contre plus
le contexte.

--
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
<1gx8d2d.kjkgpofkpi6lN%:
Oui, mais quelle est la limite de taille d'une pipe ?


Aucune. En revanche, pour les fichiers, la taille du filesystem est souvent
limitée.

J'ai ici un vieux bouquin qui dit, euh, je ne l'ai pas sous la main en
fait. Mais j'ai déjà eu des "find ... |xargs" qui partaient aux fraises
à cause d'un résultat trop long il me semble.


Avec xargs ça ne devrait pas arriver, justement parce que xargs est prévu
pour éviter ça. Ça peut arriver avec « frobnicate `find ...` » à cause de la
limite sur les arguments d'une commande, mais xargs est précisément prévu
pour découper les arguments en blocs assez petits.

Avatar
TiChou
Dans le message <news:,
*Pascal Bourguignon* tapota sur f.c.o.unix :

Laurent Wacrenier wrote:
S'il n'y a pas trop de fichiers :

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



writes:
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 ?



Oui, mais puisque vous utilisez le GNU find il y a alors plus simple :

find . -type f -printf "%T@ %pn" | sort | head

Sans les outils GNU, on peut aussi s'orienter vers un simple script perl et
la fonction stat :

#!/usr/bin/perl

use strict;

my $dir = $ARGV[0];

opendir(DIR, $dir) or die "Can't open dir $dir: $!n";
print (sort { ((stat($b))[9] <=> (stat($a))[9]} readdir(DIR))[0] . "n";
closedir(DIR);

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


Il n'y a aucun problème à passer 800000 lignes via un pipe.
ON N'EST PAS SUR MS-DOS!


Qui a parlé d'un problème à ce sujet ?

Le problème est, comme nous l'avons tous compris, qu'on est limité par le
nombre d'arguments (largement inférieur à 800 000) qui peuvent être passés à
une commande shell.
Ici la solution de Laurent Wacrenier ne fera apparaître les fichiers les
plus récents que seulement de la première série d'arguments envoyé par xargs
à la commande 'ls', bref, peu de chance parmi les 800 000 fichiers d'avoir
les plus récents dans la première série d'arguments. C'est bien pour cela
que Laurent Wacrenier faisait remarquer que sa solution ne fonctionnera
qu'avec un nombre réduit de fichiers.

--
TiChou



Avatar
Nicolas.MICHEL
"TiChou" wrote:

Qui a parlé d'un problème à ce sujet ?


Moi, je pensais que les pipe avaient une limitations de taille, ce qui
n'est donc pas le cas.

Le problème est, comme nous l'avons tous compris, qu'on est limité par le
nombre d'arguments (largement inférieur à 800 000) qui peuvent être passés à
une commande shell.
Ici la solution de Laurent Wacrenier ne fera apparaître les fichiers les
plus récents que seulement de la première série d'arguments envoyé par xargs
à la commande 'ls', bref, peu de chance parmi les 800 000 fichiers d'avoir
les plus récents dans la première série d'arguments. C'est bien pour cela
que Laurent Wacrenier faisait remarquer que sa solution ne fonctionnera
qu'avec un nombre réduit de fichiers.


Merci à toi et à Nicolas pour ces précisions :)

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

1 2