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

bash fichier le plus r

11 réponses
Avatar
Christophe PEREZ
Salut,

Je cherche depuis un petit moment le moyen de trouver, en bash, le
fichier le plus récent parmi une liste de fichiers.
Je suppose qu'avec une boucle récursive, en les comparant deux à deux,
j'y parviendrai, mais ça me semble super lourd, et je me dis qu'il y a
probablement plus simple, mais je ne trouve pas.
Si cela peut vous aider à m'aider, ces fichiers ont le même nom, et se
trouvent dans une arborescence similaire que matche une expression du
genre
rep.*/sousrep/fichier

Je ne connais pas par avance la correspondance de * (jusqu'à maintenant
ce sont des nombres à 4 chiffres, mais aucune garantie que ça ne change
pas), ni le nombre d'occurrences de "fichier".

Merci d'avance à ceux qui se pencheront sur la question.

10 réponses

1 2
Avatar
Jean-Francois Billaud
On 12/06/2013 05:02, Christophe PEREZ écrivait:

Salut,

Je cherche depuis un petit moment le moyen de trouver, en bash, le
fichier le plus récent parmi une liste de fichiers.
Je suppose qu'avec une boucle récursive, en les comparant deux à deux,
j'y parviendrai, mais ça me semble super lourd, et je me dis qu'il y a
probablement plus simple, mais je ne trouve pas.
Si cela peut vous aider à m'aider, ces fichiers ont le même nom, et se
trouvent dans une arborescence similaire que matche une expression du
genre
rep.*/sousrep/fichier

Je ne connais pas par avance la correspondance de * (jusqu'à maintenant
ce sont des nombres à 4 chiffres, mais aucune garantie que ça ne change
pas), ni le nombre d'occurrences de "fichier".

Merci d'avance à ceux qui se pencheront sur la question.



ls -lt

JFB

--
Vous avez du nouveau courrier dans /dev/urandom
Avatar
Nicolas George
Jean-Francois Billaud , dans le message
<kp943u$i2n$, a écrit :
ls -lt



La sortie de ls n'est pas faite pour être lue par un script. Celle de ls -l
encore moins.
Avatar
Nicolas George
Christophe PEREZ , dans le message <kp8obv$srr$, a
écrit :
Je cherche depuis un petit moment le moyen de trouver, en bash, le
fichier le plus récent parmi une liste de fichiers.



Avec zsh : *(.om[1])

(tu peux évidemment mettre n'importe quel motif à la place de *)
Avatar
Marc Boyer
Le 12-06-2013, Christophe PEREZ a écrit :
Salut,

Je cherche depuis un petit moment le moyen de trouver, en bash, le
fichier le plus récent parmi une liste de fichiers.
Je suppose qu'avec une boucle récursive, en les comparant deux à deux,
j'y parviendrai, mais ça me semble super lourd, et je me dis qu'il y a
probablement plus simple, mais je ne trouve pas.
Si cela peut vous aider à m'aider, ces fichiers ont le même nom, et se
trouvent dans une arborescence similaire que matche une expression du
genre
rep.*/sousrep/fichier



ls -t rep.*/sousrep/fichier | head -n 1

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
Christophe PEREZ
Le Wed, 12 Jun 2013 12:15:41 +0000, Marc Boyer a écrit :

ls -t rep.*/sousrep/fichier | head -n 1



Vous êtes gentil tous les 2 à me proposer la même solution, mais c'est
bien la première que j'ai essayé, et qui ne fonctionne pas pour des
fichiers dans des arborescences différentes. Après relecture du man,
j'avais bien compris que le -t triait les fichiers *d'un répertoire*, par
date.

Bref, le classement n'est pas bon :
ls -lt ../../users/Public/Application Data/Battle.net/Agent/Agent.*/
Agent.exe
-rwxr-xr-x 1 chris users 5845624 22 mai 01:37 ../../users/Public/
Application Data/Battle.net/Agent/Agent.1040/Agent.exe
-rwxr-xr-x 1 chris users 6065712 1 avril 20:28 ../../users/Public/
Application Data/Battle.net/Agent/Agent.1737/Agent.exe


Une autre idée ?
Avatar
Tonton Th
On 2013-06-12, Christophe PEREZ wrote:

Une autre idée ?



Peut-être find avec le -cnewer ?

--
http://foo.bar.quux.over-blog.com/article-anisette-118361455.html
Avatar
Christophe PEREZ
Le Wed, 12 Jun 2013 15:41:28 +0000, Tonton Th a écrit :

Peut-être find avec le -cnewer ?



J'y ai bien pensé, ou à -newer tout simplement, mais ça m'impose une
comparaison des fichiers 2 par 2 non ? Puisque cnewer attend un fichier
pour comparaison de date...
C'est ce dont je parlais dans mon premier post, et que je trouve super
lourd.
Avatar
Benoit Izac
Bonjour,

le 12/06/2013 à 05:02, Christophe PEREZ a écrit dans le message
<kp8obv$srr$ :

Je cherche depuis un petit moment le moyen de trouver, en bash, le
fichier le plus récent parmi une liste de fichiers.
Je suppose qu'avec une boucle récursive, en les comparant deux à deux,
j'y parviendrai, mais ça me semble super lourd, et je me dis qu'il y a
probablement plus simple, mais je ne trouve pas.
Si cela peut vous aider à m'aider, ces fichiers ont le même nom, et se
trouvent dans une arborescence similaire que matche une expression du
genre
rep.*/sousrep/fichier

Je ne connais pas par avance la correspondance de * (jusqu'à maintenant
ce sont des nombres à 4 chiffres, mais aucune garantie que ça ne change
pas), ni le nombre d'occurrences de "fichier".



Avec le GNU find :
find . -type f -name fichier -printf '%T@ %pn'
| sort -rn | sed -e 's/^[^ ]* //;q'

Voir aussi les options -maxdepth et -mindepth si nécessaire.

--
Benoit Izac
Avatar
Christophe PEREZ
Le Wed, 12 Jun 2013 22:08:47 +0200, Benoit Izac a écrit :

Avec le GNU find :
find . -type f -name fichier -printf '%T@ %pn'
| sort -rn | sed -e 's/^[^ ]* //;q'



Merci pour cette ligne qui elle (aussi) fonctionne.
Je vais paraitre con (mais bon, ça ne sera ni la première ni la dernière
fois) mon problème n'est pas du tout là en fait, c'est mon analyse des
résultats qui est fausse. Il faut que je revois tout ça.

Milles excuses.
Avatar
Lucas Levrel
Le 12 juin 2013, Christophe PEREZ a écrit :

Le Wed, 12 Jun 2013 12:15:41 +0000, Marc Boyer a écrit :

ls -t rep.*/sousrep/fichier | head -n 1



Vous êtes gentil tous les 2 à me proposer la même solution, mais c'est
bien la première que j'ai essayé, et qui ne fonctionne pas pour des
fichiers dans des arborescences différentes. Après relecture du man,
j'avais bien compris que le -t triait les fichiers *d'un répertoire*, par
date.

Bref, le classement n'est pas bon :
ls -lt ../../users/Public/Application Data/Battle.net/Agent/Agent.*/
Agent.exe
-rwxr-xr-x 1 chris users 5845624 22 mai 01:37 ../../users/Public/
Application Data/Battle.net/Agent/Agent.1040/Agent.exe
-rwxr-xr-x 1 chris users 6065712 1 avril 20:28 ../../users/Public/
Application Data/Battle.net/Agent/Agent.1737/Agent.exe



ls -t met le plus récent d'abord (d'où le head de Marc), c'est bien ce que
tu constates.

Ici c'est le shell qui remplace le motif par la liste de fichiers, donc ls
en quelque sorte ne voit pas les répertoires. Du moins, chez moi ça
marche.

--
LL
1 2