©
. Document créé le 8 juillet 2010 , mis à jour le 8 juillet 2010.On ne va jamais aussi loin que lorsqu'on ne sait pas où l'on va. Christophe Colomb
Accueil du site > Astuces > MacOSX > Script inventaire de répertoire
Le script dir_ls ci-dessous est un exemple comme un autre de script PHP exécutable en ligne de commande (Terminal.app).
Le résultat de dir_ls est l’inventaire des répertoires et fichiers du répertoire courant ou indiqué en option. A noter que dir_ls ne suit pas les liens. Par contre, il poursuit son inventaire par une fonction récursive.
Voici un exemple de résultat :
> dir_ls -s www.foo.bar
.css: 81
.doc: 243
.htm: 4
.html: 92
.pdf: 68
.rtf: 57
.zip: 1
is_dir: 81
is_link: 1
Total: 628 dont 546 fichiers, 81 dossiers, 1 lien
Dans cet exemple, le répertoire www.foo.bar pèse 265 Mo. Le résultat est donné en moins 0.06 s.
dir_ls se veut être un exemple/exercice assez complet pour la réalisation d’un script PHP destiné à être utilisé en ligne de commande :
<?php
/*
* dir_ls: Inventaire d'un répertoire
* Donne le nombre de fichiers par type.
*
* Licence MIT + GNU GPL, etc.
*
* Christian Paulus <cpaulus at quesaco.org>
* (c) 2010
*
* version: Thu Jul 8 10:04:20 CEST 2010
*
* */
$this_dir = '.';
$no_lower = $print_help =
$print_total = $verbeux = false;
if($argc > 1) {
// Le premier arg est le nom de ce script
// Passer à l'argument suivant
while ($arg = next($argv)) {
if ($arg[0] === '-') {
// si c'est une option
switch ($arg) {
case '-c':
$no_lower = true;
break;
case '-s':
$print_total = true;
break;
case '-h':
case '--help':
case '-help':
case '-?':
$print_help = true;
break;
case '-v':
$verbeux = true;
break;
}
}
else {
// ou un nom de répertoire
$this_dir = $arg;
}
}
}
if ($print_help) {
fwrite(STDOUT, "
dir_ls: liste le contenu d'un répertoire.
Affiche le résultat trié par types de fichiers.
Usage: {$argv[0]} [-h] [-v] [-?] [REPERTOIRE]
Options:
-c respecter la casse
-h afficher l'aide et quitter.
-v mode verbeux. Liste des fichiers.
-? afficher l'aide et quitter.
REPERTOIRE répertoire cible.
Par défaut, le répertoire cible
est le répertoire courant (.).
");
exit();
}
function add_item ($index, $file, $result) {
if(!isset($result[$index])) {
$result[$index] = array();
}
$result[$index][] = $file;
return($result);
}
function dir_audit ($path, $result) {
global $no_lower;
if ($dh = @opendir($path)) {
while (($file = readdir($dh)) !== false) {
if (($file == '.') || ($file == '..')) {
continue;
}
//
if (is_link($path.'/'.$file)) {
$result = add_item('is_link', $file, $result);
}
else if (is_dir($path.'/'.$file)) {
$result = add_item('is_dir', $path.'/'.$file, $result);
$result = dir_audit($path.'/'.$file, $result);
}
else {
$ext =
(($pos = strrpos($file, '.')) !== false)
? substr($file, $pos)
: 'unknown'
;
$ext = ($no_lower ? $ext : strtolower($ext));
$result = add_item($ext, $path.'/'.$file, $result);
}
}
}
else {
fwrite(STDERR, 'Error: ' . $path
. ' manquant ou n\'est pas un dossier'
. PHP_EOL );
}
return ($result);
}
$result = array();
$result = dir_audit ($this_dir, $result);
ksort($result);
$total = 0;
foreach($result as $type=>$array) {
fwrite(STDOUT, $type . ': '.count($array)."\n");
if ($verbeux) {
foreach($array as $k => $v) {
fwrite(STDOUT, "\t".$v."\n");
}
}
$total += count($array);
}
if ($print_total) {
$dont = array(
'fichier' => 0,
'dossier' => count($result['is_dir']),
'lien' => count($result['is_link'])
);
$dont['fichier'] = $total - $dont['dossier'] - $dont['lien'];
$total = 'Total: ' . $total . ' dont ';
foreach($dont as $k => $v) {
if ($v) {
$total .= $v . ' ' . $k
. (($v > 1) ? 's' : '')
. ', ';
}
}
$total = rtrim($total, ', ');
fwrite(STDOUT, $total . PHP_EOL);
}
?>
Si vous désirez rendre ce script directement exécutable, il faut placer la ligne magique au début (l’interpréteur) :
# !/usr/bin/php
et lui appliquer les droits nécessaires :
chmod u+x dir_ls
Si votre environnement n’est pas MacOsX, corrigez le chemin indiqué (utilisez whereis php si besoin).
Problème de copier/coller ? Voici le script compressé :
Les forums sont fermés.