OVH Cloud OVH Cloud

parser la sortie de la command ls

4 réponses
Avatar
cyrille
Bonjour,

avant de re-inventer la roue, ce qui est très mal.
Je cherche à extraire les infos fichiers depuis la sortie d'une commande ls.

genre :
$listing = `ls -l` ;
puis extraire les noms et la taille des fichiers.

Connaissez vous un package qui fait ça ?
Avez vous ça dans vos tiroirs ?

merci
cyrille

4 réponses

Avatar
Ronan Le Hy
cyrille a écrit:
Je cherche à extraire les infos fichiers depuis la sortie d'une commande
ls.


Tu peux probablement te passer d'utiliser ls, si c'est juste pour avoir
des infos sur des fichiers.
perldoc -f -X
perldoc -f glob

lehy ~/tmp> l

total 12K
drwxr-xr-x 2 lehy sharp 512 Nov 4 11:28 ./
drwxr-xr-x 82 lehy sharp 7.0K Nov 4 11:28 ../
-rw-r--r-- 1 lehy sharp 13 Nov 4 11:28 bah
-rw-r--r-- 1 lehy sharp 9 Nov 4 11:28 bih
-rw-r--r-- 1 lehy sharp 0 Nov 4 11:28 boh
-rw-r--r-- 1 lehy sharp 17 Nov 4 11:28 bouh
-rw-r--r-- 1 lehy sharp 5 Nov 4 11:28 buh

lehy ~/tmp> perl -lwe 'print "fichier: $_->[0], taille: $_->[1] o" for
map {[$_, -s]} glob "*"'
fichier: bah, taille: 13 o
fichier: bih, taille: 9 o
fichier: boh, taille: 0 o
fichier: bouh, taille: 17 o
fichier: buh, taille: 5 o


HTH

--
Ronan

You can write obscure code in any language, and significant programs in
a language you have only superficial knowledge about are always
unreadable - especially if prejudice prevent you from actually trying to
overcome notational barriers. A major part of readability is simply
familiarity and experience.
Bjarne Stroustrup

Avatar
root
On Tue, 04 Nov 2003 11:26:16 +0100, cyrille wrote:

Bonjour,

avant de re-inventer la roue, ce qui est très mal.
Je cherche à extraire les infos fichiers depuis la sortie d'une commande ls.

genre :
$listing = `ls -l` ;
puis extraire les noms et la taille des fichiers.

Connaissez vous un package qui fait ça ?
Avez vous ça dans vos tiroirs ?



Une version avec opendir() + readdir() + stat() :

#!/usr/bin/perl
use strict;
use warnings;

my $dir = shift;
opendir(DIR, $dir) or die "Oops $!n";

my %fsize = map {
$_ => (stat("$dir/$_"))[7] # on crée un élément (fichier => taille)
} grep {
-f "$dir/$_" # on ne conserve que les fichiers
} readdir(DIR);

foreach my $file (keys %fsize) {
print "$file -> $fsize{$file}n";
}

Avatar
cyrille
Je suis obligé de récupérer le résultat de la commande 'ls -l' dans une
chaine ou un tableau de chaîne.

en fait c'est le résultat de commandes exécutées à distances via rsync.

cyrille
Avatar
Paul GABORIT
À (at) Tue, 04 Nov 2003 14:12:09 +0100,
cyrille écrivait (wrote):
Je suis obligé de récupérer le résultat de la commande 'ls -l' dans une
chaine ou un tableau de chaîne.


X: la question initiale du fil de discussion.

en fait c'est le résultat de commandes exécutées à distances via rsync.


Y: le vrai problème.

Un nouveau cas de syndrome XY ! ;-)

Puisque vous utilisez rsync, pourquoi ne pas utiliser l'un des nombreux
modules Perl permettant de gérer cela ?

<http://search.cpan.org/search?query=rsync&mode=all>

Parmi ces modules, on trouve
<http://search.cpan.org/~cbarratt/File-RsyncP-0.44/FileList/FileList.pm> qui
semble correspondre à votre besoin.


--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>