Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 13/08/2012, à 10:07

Efhache84

[resolu] extraire fichier plus récent de différents sous-dossier

Bonjour à tous et toutes.

Je cherche à réaliser un script bash qui me permettrait de vérifier le contenue d'un dossier (+sous-dossier) et pour chaqu'un extraire le timestamp et le nom du fichier le plus récent.
Je pense que ls -R  peut-être la commande de base, mais j'avoue ne pas trop savoir comment me lancer dans l'aventure.
J'avais commencé à réaliser quelquechose en php, mais malheureusement je ne peut faire tourner du php sur la machine que je veux vérifier (et pas non plus moyen d'installer php) conclusion je dois faire cela en bash.

QUelqu'un aurait-il une idée ? une solution ?



Pour info la version php  :

<?php

date_default_timezone_set("Europe/Brussels");

$config_file_path = '/home/fabian/NetBeansProjects/auto_check_services/config_checker.ini';

//default value
$base_folder_path   = '/home';
$subfolder_exception    = '';
$otherfoldertest ='';
$report_csv_path    = '/srv/www/htdocs/';
$report_html_path = '/srv/www/htdocs/';


openlog("CheckServicesScript",LOG_CONS | LOG_ODELAY | LOG_PERROR | LOG_PID,LOG_LOCAL0);


/** INIT : read config file and set variables**/

include($config_file_path);

if (isset($base_folder))
{
    $base_folder=trim($base_folder);
    if (empty($base_folder));
    else
    {
        if(is_dir($base_folder))
            $base_folder_path=$base_folder;
        else
            syslog(LOG_WARNING, "$base_folder is not a directory");
    }
    
}
syslog(LOG_WARNING, "Base Path folder to check is : $base_folder_path");



if (isset($excepted_folder))
    $subfolder_exception=$excepted_folder;
$subfolder_exception=trim($subfolder_exception);
if (empty($subfolder_exception));
else
    syslog(LOG_WARNING, "Will not check this folder : $subfolder_exception");



if (isset($include_folder))
{
    $include_folder=trim($include_folder);
    if (empty($include_folder));
    else
    {
        if (is_dir($include_folder))
        {    
            $otherfoldertest=$include_folder; 
            syslog(LOG_WARNING, "Will also check folders : $otherfoldertest");
        }
    }
}



if (isset($report_folder))
{
    $report_folder=trim($report_folder);
    if (empty($report_folder));
    else
    {
    if (is_dir($report_folder))
    {    
        $report_csv_path=$report_folder; 

    }
    }
    if($report_csv_path{strlen($report_csv_path)-1}=='/')
    {
        $report_csv_path{strlen($report_csv_path)-1}=' ';
        $report_csv_path=trim($report_csv_path);
    }
}
$report_csv_path=$report_csv_path.'/rerport_check_services.csv';
syslog(LOG_WARNING, "CSV report will be saved into:$report_csv_path");




if (isset($html_folder))
{
    $html_folder=trim($html_folder);
    if (empty($html_folder));
    else
    {
    if (is_dir($html_folder))
    {    
        $report_html_path=$html_folder; 

    }
    }
    if($report_html_path{strlen($report_html_path)-1}=='/')
    {
        $report_html_path{strlen($report_html_path)-1}=' ';
        $report_html_path=trim($report_html_path);
    }
}
$report_html_path=$report_html_path.'/checkservices.html';
syslog(LOG_WARNING, "HTML report will be saved into:$report_html_path");


//syslog(LOG_WARNING, "$base_folder_path $subfolder_exception $otherfoldertest $report_csv_path $report_html_path");

/** CHECKING : get date of the earlier file in the folder
 *  and verify that the date is within last two hours 
 */

 
$tab=array();
$j=0;

lister($base_folder_path,$j,$tab,$subfolder_exception);
checktimestamp($tab);
//print_r($tab);



/** REPORT : create report file CSV **/

$reportfilecsv=fopen($report_csv_path, 'a');
fputs($reportfilecsv,"list of folder without data :\n");
for($j=0;$j<count($tab);$j++)
{
    if($tab[$j][2]==1)
    {
        $logmsg=$tab[$j][0].';'.$tab[$j][1]."\n";
        syslog(LOG_WARNING, "$logmsg");
        fputs($reportfilecsv,$logmsg);
    }
}
fclose($reportfilecsv);


/** HTML REPORT : create report table in html **/




/*** FUNCTIONS ***/
function lister($chemin,&$indextab,&$tablist,$direxception )
{
    $nom_repertoire = $chemin;
    $pointeur = opendir($nom_repertoire);

    while ($fichier = readdir($pointeur))
    {
        if(($fichier != '.') && ($fichier != '..'))
        {
            if (is_dir($nom_repertoire.'/'.$fichier) && $fichier!=$direxception)
            {
                $tablist[$indextab][0]="$nom_repertoire/$fichier";
                $plusrecent=array(0 => 0, 1 => '' );
                $fichiers=glob($tablist[$indextab][0].'/backup');
                foreach($fichiers as $fichier2)
                {
                    if(filemtime($fichier2)>$plusrecent[0])
                    {
                        $plusrecent=array(0 => filemtime($fichier2), 1 => $fichier2);
                        $tablist[$indextab][1]=date ("Y-m-d H:i:s",filemtime($fichier2));
                        $tablist[$indextab][2]=0;
                    }
                }
                 
                 
                  $indextab++;
            }
        }
    }
    closedir($pointeur);
}

function checktimestamp(&$listfolder)
{
    $timeRef = date('Y-m-d H:i:s',strtotime('-2 hours'));  //reference time is two hours ago
    
    for($j=0;$j<count($listfolder);$j++)
    {
        $timeDiff = strtotime($timeRef) - strtotime($listfolder[$j][1]);
        
        if($timeDiff>0)
            $listfolder[$j][2]=1;
    }
}

?>

Dernière modification par Efhache84 (Le 13/08/2012, à 11:41)


Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits

Hors ligne

#2 Le 13/08/2012, à 10:34

iuchiban

Re : [resolu] extraire fichier plus récent de différents sous-dossier

Salut.

Un petit truc de ce genre devrait convenir :

$ for _D in $(find . -type d)
do
  _F=$(ls -t ${_D} | head -1)
  _T=$(date --date "$(stat ${_D}/${_F} | grep Modify | cut -d" " -f2-)" +%s)
  echo "${_D} : ${_F} - ${_T}"
done

Tu cherches tous les répertoires à partir du répertoire courant
Pour chacun de ces répertoires, on liste les fichiers par temps et on prend le premier.

Je regarde pour rajouter le timestamp smile (sous quel format te le faut-il d'ailleurs ??)

Je t'ai mis le timestamp au format %s (timestamp unix).
Tu peux jouer avec ce format pour avoir par exemple : aaaammjj-HH:MM:SS

Dernière modification par iuchiban (Le 13/08/2012, à 10:44)


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#3 Le 13/08/2012, à 10:40

Efhache84

Re : [resolu] extraire fichier plus récent de différents sous-dossier

ok pour le timestamp avec stat ??

sinon la boucle que tu me donnes sembles aussi me lister un sous-sous-repertoire. en php je pourrais virer cela avec un isdir, mais en bash comment filtrer cela?


Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits

Hors ligne

#4 Le 13/08/2012, à 10:45

iuchiban

Re : [resolu] extraire fichier plus récent de différents sous-dossier

Pour la profondeur de recherche tu peux utiliser :

find . -type d -maxdepth 1

C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#5 Le 13/08/2012, à 11:02

Efhache84

Re : [resolu] extraire fichier plus récent de différents sous-dossier

ok merci beaucoup.

par contre je me rends compte que je souhaite inverser la recherche. Je souhaiterais les directory qui n'ont pas été modifié endéans x minutes (120 minutes par exemple)  est-ce faisable ?


Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits

Hors ligne

#6 Le 13/08/2012, à 11:17

iuchiban

Re : [resolu] extraire fichier plus récent de différents sous-dossier

_TIME=$(date +%s)
for _D in $(find . -type d)
do
  _T=$(date --date "$(stat ${_D} | grep Modify | cut -d" " -f2-)" +%s)
  if [[ $((${_TIME}-${_T})) -gt 7200 ]]
  then
    echo "${_D} est vieux"
  else
    echo "${_D} est récent"
  fi
done

sachant que le 7200 est en secondes.

Dernière modification par iuchiban (Le 13/08/2012, à 11:17)


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#7 Le 13/08/2012, à 11:41

Efhache84

Re : [resolu] extraire fichier plus récent de différents sous-dossier

merci génial !!


Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits

Hors ligne

#8 Le 13/08/2012, à 12:07

Watael

Re : [resolu] extraire fichier plus récent de différents sous-dossier

salut,

shopt -s nullglob globstar
for dir in ./**/*
do
   if test -d "$dir"
   then
      _T=$(stat -c%Y)

etc.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 15/08/2012, à 04:45

nesthib

Re : [resolu] extraire fichier plus récent de différents sous-dossier

un petit exemple en zsh :

stat **/*(.om[1])

va donner des informations sur le fichier le plus récent du dossier et des sous-dossiers

** → recherche récursive
(.) → fichiers
(om) → fichiers du plus récent au plus ancien
(om[1]) → seulement le premier fichier de la liste (= le plus récent)

smile


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne