Réalisation Script Bash pour un projet

Bonjour à tous,

Actuellement sous debian Leny chez OvH, je suis à la recherche de personnes qui pourraient m’aider à la réalisation d’un certain script en bash. ( Ou peut être, dans l’idéal quelqu’un qui pourrait m’orienter vers un script existant. )

J’aimerai créé un script qui me permettait de scanner un dossier dans lequel des fichiers viennent continuellement s’ajouter. Lorsque celui-ci detecte un nouveau fichier qui est apparu, il écrit dans un fichier php ou html spécifique le lien du nouveau fichier.

Voilà la maquette :

Un dossier X avec dedans un fichier Alpha.avi et Beta.bmp qui viennent d’apparaitre.

Un dossier Y avec dedans une page index.html.

Le script scanne le dossier X et voit le nouveau fichier Alpha.avi et Beta.bmp. Il écrit dans index.html l’url de ces derniers ( sans forcément de mise en page. Une simple balise de formatage basique suffit ( color, center et basta ).

Je n’ai pas vraiment de base en bash voilà pourquoi je me tourne vers des personnes expertes en la matière.

Merci par avance. Si vous avez des questions, n’hésitez pas.

Pour ce genre de chose linux exporte une API du nom de inotify qui permet au programme de suivre ce qui se passe dans un répertoire sans avoir à scanner périodiquement celui-ci. Je ne crois pas qu’il existe de programme pour l’utiliser en shell donc voici un programme C qui réalise ce que tu souhaite.

[code]#include <stdio.h>
#include <sys/inotify.h>

#define EVENT_SIZE (sizeof (struct inotify_event))
#define BUF_LEN (1024 * (EVENT_SIZE + 16))

int main (int argc, char **argv){
char buf[BUF_LEN];
int len, i, n;
int notify = inotify_init();

if(-1 == notify){
perror(“inotify_init”);
return -1;
}

for(i = 1; i < argc; ++i){
n = inotify_add_watch(notify, argv[i], IN_CREATE|IN_MOVED_TO);
if(n <= 0){
perror(“inotify_add_watch”);
return -1;
}
}

while((len = read (notify, buf, BUF_LEN)) > 0){
i = 0;
while (i < len) {
struct inotify_event *event;

  event = (struct inotify_event *) &buf[i];
  
  if (event->len)
printf ("name=%s\n", event->name);

  i += EVENT_SIZE + event->len;
}

}
return 0;
}[/code]
Bien sur ne connaissant pas la tête du fichier index.html je ne peux pas t’en dire plus. Mais je peux déjà te dire que c’est pas le plus simple d’écrire au bon endroit dans le fichier ou alors recréer le fichier index.html à chaque fois.

Il serait probablement plus élégant d’inclure ceci à ton fichier index.php :

[code]<?php
$dir = “/le/dossier/a/scanner/”;

// Open a known directory, and proceed to read its contents
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
echo ‘’.$file.’’;
}
closedir($dh);
}
}
?>[/code]

[quote=“MisterFreez”] Je ne crois pas qu’il existe de programme pour l’utiliser en shell.
[/quote]

inotifywait du paquet inotify-tools, mais ç’est plus pour tester le comportement d’inotify - c’est pas très fiable. Je préfère ton code à mon hack plus bas.

Je donne tout de même un exemple vite fait (perl ayant un module inotify, le concept est naze, autant le faire en perl pur):

#!/bin/sh
options='-r -e create -e delete -e move --format %e:%f' 
fichier='/tmp'

while retour="$(inotifywait $options $fichier 2> /dev/null)"; do
	echo $retour | perl -ne '
		%actions = ( 
			MOVED_TO => "Déplacé: ",
			MOVED_FROM => "Déplacé: ",
			DELETE => "Supprimé: ",
			CREATE => "Créé: ",
         "CREATE,ISDIR" => "Répertoire créé: ",
			"DELETE,ISDIR" => "Répertoire supprimé: ",
			"ETC." => ""
		);
		@args = split/:/;
		print $actions{$args[0]}.$args[1]."\n";
	'
done

Fallait pas me parler de perl :

[code]#!/usr/bin/perl

use strict;
use warnings;
use Linux::Inotify2;
use 5.10.0;
use FileHandle;

use constant DIR => $ENV{HOME}.’/X’;
use constant DEST_FILE => $ENV{HOME}.’/Y/liste.html’;

my $inotify = new Linux::Inotify2 or die ‘Impossible de créer une nouvelle instance inotify’;
my $watch = $inotify->watch(DIR, IN_ALL_EVENTS)
or die ‘La création de l’observateur a échoué’;

while (1) {
my @events = $inotify->read;

opendir REP, DIR or die 'impossible d\'ouvrir le repertoire';
my @fichiers = grep { !/^\./} readdir REP;

open(FILE,'>'.DEST_FILE) or die 'Impossible d\'ouvrir '.DEST_FILE;
FILE->autoflush(1);

foreach (@fichiers) {
    FILE->say('<a href="'.DIR.$_.'">'.$_.'</a>');
}

close FILE;

}[/code]
Cette version est bien meilleure elle prend en compte la suppression de fichier.
Et je conseil d’utiliser index.php :

[code][…]

<? require liste.html ?>

[…][/code]

Merci beaucoup !

J’ai essayé de monter ce que tu as mis dans ton dernier topic MisterFreez et lorsque j’exécute le script voilà le message d’erreur :

La création de l'observateur a échoué at ./scan line 13.

Voilà comment j’ai procédé :
-apt-get install inotify-tools
-Copié collé de ton script dans un nouveau fichier ‘scan’
-J’ai édité dedans le répertoire de destination et le fichier html à mettre à jour.

use constant DIR => $ENV{HOME}.'/home/AAA/BBB/CCC/secure'; use constant DEST_FILE => $ENV{HOME}.'/home/DDD/test.html';

  • chmod +x
  • ./scan

Tu as installé inotify2 avec CPAN ?

oui

j’ai fait cpan>install Linux::Inotify2

Je fais un p’tit up au cas où quelqu’un aurait trouvé une solution. Merci d’avance.

Il me faudrait le même genre de script, je m’étais dis que j’allais me mettre à scripter il y a déjà 2 - 3 mois de ça mais bon j’ai pas eu le courage, pourtant je pense que ça serait assez simple pour la plus part d’entre vous de le concevoir :

J’ai un dossier dans lesquels se créent des fichiers continuellement.
Un même fichier peut être écrit au moins pendant 45 minutes avant d’être considéré comme pouvant être archivé.
J’aurai besoin d’un script qui toutes les heures scan ce dossier, détecte les fichiers avec l’extension spécifiée qui sont plus vieux qu’une heure et trente minutes, et qu’il les déplace dans un dossier, qu’ensuite à 2 heures du matin tous les nouveaux fichiers déplacés soient compressés.

Hé bien tu te met au script shell tu regardes les commandes find ou même ls qui peuvent t’aider mv, tar bzip peuvent être intéressant aussi, tu as aussi crontab qui va pouvoir te faire ça de manière régulière une fois que tu as cela de fait reviens nous voir avec ce que tu as fais et on t’aidera à l’améliorer :wink: