Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > Unix
Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2011, 13h13   #1
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Par défaut traiter des fichiers par ordre de date

Bonjour,

Je lis ici souvent qu'on ne doit pas traiter des listes de fichier à l'aide de ls .
Comment feriez vous pour recuperer la liste de fichiers triés par date de derniere modif sans passer par ls -t ( avec ou sans r ...)
?
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/12/2011, 15h27   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 538
Points : 7 754
Points : 7 754
le refus du tri dans le résultat de "ls" vient du fait que c'est une capture d'affichage et donc un traitement sur chaines de cratères ce qui est donc lent...
concrètement, vu les perfs des disques/machines actuelles cette restriction est faible.

Mais l'usage veux qu'on évite de le faire pour une autre raison beaucoup plus pertinente celle là. C'est que la sélection de fichier par la commande ls ou encore les droits même en lecture sur le répertoire à traiter peut influencer grandement le résultat, sans parler des limites d'affichage, ou encore des limites en nombre de fichiers par répertoires selon les files systèmes etc...

On cherche donc généralement à trouver un traitement par lot, ou par exemple la commande find, qui associée à l'option exec, ou encore dans une boucle permettra la réalisation d'un traitement par fichier correspondant à la recherche, chaque traitement étant alors unitaire, le risque d'effets de bords indésirable tend vers zéro.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/12/2011, 15h45   #3
Membre Expert
 
Avatar de jlliagre
 
Inscription : juin 2007
Messages : 968
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2007
Messages : 968
Points : 1 375
Points : 1 375
Citation:
Envoyé par Jean.Cri1 Voir le message
Je lis ici souvent qu'on ne doit pas traiter des listes de fichier à l'aide de ls .
Ce n'est pas une règle, juste un conseil, et qui n'est pas systématique. Ce qui arrive souvent, c'est qu'une commande utilise 'ls' alors que ce n'est pas nécessaire. Le fait d'utiliser 'ls' peut entrainer des erreurs si les noms de fichiers contiennent des espaces et autres caractères spéciaux.
Comme l'a déjà dit frp31, 'find' est en général plus approprié car il permet de traiter n'importe quel nom de fichier dans la directive '-exec'.
Citation:
Comment feriez vous pour recuperer la liste de fichiers triés par date de derniere modif sans passer par ls -t ( avec ou sans r ...)
?
J'utiliserais "ls -t", surtoût s'il s'agit juste d'afficher la liste des fichiers.
__________________
ɹǝsn *sıɹɐlos*
jlliagre est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 20/12/2011, 10h20   #4
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Le but de la recupération est evidement de traiter les fichiers en attente par ordre d'arrivée.
C'est fait avec un
Code :
1
2
3
4
for i in $( ls -1t [patern eventuel]* )
do
... $i ...
done
Nous sommes conscients des limites de la sortie du ls, les fichiers portent des noms 'normaux' et le resultat est la.

C'est juste un cas d'école que je soumets pour trouver des solutions "propres" pour tous.

Personnellement je ne vois pas comment faire autrement,
tout ce que je peux proposer c'est :
Code :
1
2
3
4
ls -1t [patern eventuel]* | while read i
do
... "$i" ... #pour les noms bizzares sauf ceux qui contiendraient eux meme ' " '
done
et vous ?
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/12/2011, 11h19   #5
Membre Expert
 
Avatar de jlliagre
 
Inscription : juin 2007
Messages : 968
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2007
Messages : 968
Points : 1 375
Points : 1 375
"ls -t" suffit, le -1 est redondant ici.

Ton deuxième exemple gère la plupart des noms de fichiers tordus, y compris ceux qui ont des guillemets anglais " dans leur nom. Le seul cas que je vois qui ne passerait sont les fichiers qui on une fin de ligne dans leur nom, mais c'est plutôt rare ...

Code :
1
2
3
4
5
6
7
8
9
rm -rf /tmp/testls
mkdir /tmp/testls
cd /tmp/testls
touch a b "aa bb" "$(printf "aaa\tbbb")" "$(printf "aaaa\nbbbb")" "aaaaa\"bbbbb"
ls -l
ls -t | while read i
do
    echo "[$i]"
done
affiche

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
total 0
-rw-r--r-- 1 jlliagre jlliagre 0 2011-12-20 11:21 a
-rw-r--r-- 1 jlliagre jlliagre 0 2011-12-20 11:21 aaaaa"bbbbb
-rw-r--r-- 1 jlliagre jlliagre 0 2011-12-20 11:21 aaaa?bbbb
-rw-r--r-- 1 jlliagre jlliagre 0 2011-12-20 11:21 aaa?bbb
-rw-r--r-- 1 jlliagre jlliagre 0 2011-12-20 11:21 aa bb
-rw-r--r-- 1 jlliagre jlliagre 0 2011-12-20 11:21 b

[a]
[aaaaa"bbbbb]
[aaaa]
[bbbb]
[aaa	bbb]
[aa bb]
[b]
Seul "aaaa\nbbbb" n'est pas traité correctement.
__________________
ɹǝsn *sıɹɐlos*
jlliagre est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h11.


 
 
 
 
Partenaires

Hébergement Web