Script inventaire de répertoire

© Christian PAULUS. Document créé le 8 juillet 2010 , mis à jour le 8 juillet 2010.

Aucune route n'est longue à côté d'un ami. Proverbe japonais

Accueil du site > Astuces > MacOSX > Script inventaire de répertoire

PHP / MacOsX 10.6 (Snow Leopard)

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.

Un exemple de script PHP

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 :

  • utilisation des options de commande : testez par exemple dir_ls -h pour obtenir l’aide en ligne ;
  • utilisation de STDOUT et STDERR pour, respectivement, la sortie standard et la sortie des erreurs.

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

GZ - 1.2 ko

Plussoyez !

Les forums sont fermés.