Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Shell : supprimer fichiers vides
Envoyé par: GBL

Bonjours tout le monde, mon probleme est le suivant:

Je doit créer le script-shell ci-dessous:

-parcours des repertoires a partir d'un argument.
-recherche tous les fichiers vides pour les detruire.

La commande find est proscrite, sinon ce projet serait deja fini :-))

Nous avons effectué un script shell qui ne repond qu'a quelques attentes,
il repere les fichiers vides (pourvus qu'il ne soit pas cachés
et dans le repertoire courant: premier hic) et il ne supprime que ceux
du repertoire courant (mais pas les autres, conséquence du premier hic: deuxieme hic).

####

#!/bin/sh

for x in *
do
if test -d $x
then
cd $x
else
if test -s $x
then
echo $x est un fichier non vide
else
echo $x est fichier vide
rm $x
fi
fi
done

####

En esperant une aide, merci d'avance, cordiallement GBL.

Poste le Monday 22 October 2007 12:00:09
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: oudoubah

Pas de réponse, mais de quoi réfléchir (sinon ton exercice n'aurait plus d'intérêt ];-) ):

Quel est le meilleur moyen d'obtenir de la récursivité : des fonctions? de l'itératif? Rappel d'un sous-shell où lancer un autre script?

Première étape, modifie ton script en fonction de la réponse à ta première question. Ensuite, on verra.

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Monday 22 October 2007 12:18:54
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: GBL

Le soucis c'est qu'on vient de commencer le shell et qu'on a meme pas abordé
des notions telles que le sous-shell, pour tout dire je suis en premiere année
de licence maths-infos et nous avons a vrais dire pas vraiment fait de cours sur le shell :-/

Poste le Monday 22 October 2007 12:25:21
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: oudoubah

Le "sous-shell", c'est appeler un script dans ton script.

Comme livre d'appoint pour du shell, je te conseille celui de sve@r

Première étape pour ton problème : écrit l'algorithme (avec les fonctions, c'est beaucoup plus simple ;-)).

Il faut toujours commencer par réfléchir à l'algorithme. Fait fonctionner à la main ton algorithme, pour voir si les résultats sont cohérents par rapport à ce que tu veux.

Ensuite, tu peux commencer à le coder.

Une fonction en shell, c'est
nom_de_fonction() {
corps
}

Les paramètres sont comme ceux d'un script : $1, $2,...
pour appeler la fonction, c'est :
nom_de_fonction param1 param2 ...

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Monday 22 October 2007 13:26:35
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: GBL

Merci pour les eclairssissements, je vais voir sa, je vous tiens au courant.
En tout cas c'est super sympa de nous aider :-)

Poste le Monday 22 October 2007 13:39:36
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: blazers

Bonjour à tous,

Ce script m'à l'air intéressant, en effet, j'ai pas mal de fichiers vides.

En m'aidant de ton script, j'ai essayé de faire cela ;
sur la première ligne du script, en faisant for x in ls -alR * semble être une possibilité mais en le lançant, "can't cd" s'affiche...

autre possibilité: toujours sur la première ligne : for x in $(ls -R|ls - al *)
ici la récursivité à l'air de fonctionner mais les fichiers vides cachés ne sont pas supprimés.


Pas facile de trouver cela sur divers sites, bien dommage

Si quelqu'un pouvait intervenir, ou m'expliquer pourquoi le can't cd ne s'ouvre pas,
ce serait sympa

cordialement,

Poste le Wednesday 24 October 2007 23:36:02
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: oudoubah

Citation
blazers
Ce script m'à l'air intéressant, en effet, j'ai
pas mal de fichiers vides.

Si c'est juste pour les supprimer, le plus simpl eest d'utiliser la commande find.

Le sujet de GBL est plutôt un sujet didactique pour apprendre le shell.

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Thursday 25 October 2007 12:17:11
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: PlainStupidPenguin

Salut,

Citation

Le soucis c'est qu'on vient de commencer le shell et qu'on a meme pas abordé des notions telles que le sous-shell, pour tout dire je suis en premiere année de licence maths-infos et nous avons a vrais dire pas vraiment fait de cours sur le shell

Le soucis, c'est que le shell sans les commandes ça fait pas grand chose, donc si on ne sait pas quelles commandes tu as le droit d'utiliser, c'est difficile de te guider (et du coup -- mes 2¢ -- je trouve ça un peu idiot de vous faire bosser sur du shell en vous interdisant l'usage des commandes adéquates alors que c'est précisément ce qui fait l'efficacité d'un script).

Par exemple, si tu as le droit à tree, tu peux commencer par un truc genre :

for fichier in $(tree -f -i --noreport); do
   if [ -s $fichier ]; then
        true
   else
        false
   fi
done

Poste le Thursday 25 October 2007 13:17:29
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: oudoubah

Citation
PlainStupidPenguin
je
trouve ça un peu idiot de vous faire bosser sur du
shell en vous interdisant l'usage des commandes
adéquates alors que c'est précisément ce qui fait
l'efficacité d'un script

Ca peut permettre d'aborder d'autres notions : récursivité, boucles, tests,...

Pour être efficace en shell, il faut maitriser les différents outils.

Merci pour la commande tree, je ne la connaissais pas ;-)

C'est parfois utile de savoir recréer un outil lorsqu'on ne l'a pas à disposition. Par exemple, j'ai eu besoin pour un script d'utiliser la commande sed dans un environnement restreint, où sed n'existait pas. On doit prendre alors les quelques commandes disponibles pour faire ce dont on a besoin.

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Thursday 25 October 2007 14:23:05
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: PlainStupidPenguin

Citation
oudoubah
Ca peut permettre d'aborder d'autres notions : récursivité, boucles, tests,...
Oui d'accord, mais pour ça, autant prendre de vrais exemples, des cas où tu as vraiment besoin d'agir récursivement, de faire des boucles, etc. Bref, faire qu'on sente qu'on n'a pas inventé tout ça pour faire joli mais parce que c'était plus simple et naturel de faire comme ça.

Citation

Pour être efficace en shell, il faut maitriser les différents outils
100% d'accord, mais si tu te bases sur des commandes qui se trainent le c*l par terre, mécaniquement ton script se trainera le c*l par terre, ce même si ta syntaxe est par ailleurs un jardin à la française.

C'est vrai que souvent on s'en moque (pour +- 20-30ms), mais pas toujours. D'autant que là non seulement find est très efficace mais il permet en plus de réaliser la tâche demandée de manière très concise.

Citation

C'est parfois utile de savoir recréer un outil lorsqu'on ne l'a pas à disposition. Par exemple, j'ai eu besoin pour un script d'utiliser la commande sed dans un environnement restreint, où sed n'existait pas. On doit prendre alors les quelques commandes disponibles pour faire ce dont on a besoin.
Oui, lorsqu'on ne l'a pas à disposition. Mais note que ça suppose une bonne connaissance de la boîte à outils... c'est bien pour ça que commencer par cet aspect me paraît mettre la charrue avant les boeufs. C'est comme si on commençait par apprendre à un plombier à démonter un syphon en bidouillant une pince coupante.

Mais bon, tout ça reste mes 2¢, c'est entendu. ;-)

Citation

Merci pour la commande tree, je ne la connaissais pas
Je ten prie, avant d'explorer le man moi je ne savais pas qu'on pouvait la plier de la sorte. :-)

Poste le Thursday 25 October 2007 18:10:36
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: GBL

Bonsoir, j'ai un peu avancé et j'aimerais vraiment qu'on me débloque sur ce coup parsque la X-o

Mon script a évolué, il est capable désormais de supprimer les fichier vide, meme cachés, du repertoire courant
et a "reperer" les fichiers vides, meme cachés, plus haut dans l'arborescence, seulement il y a un probleme, le seul qui me bloque en fait, la commande rm ne marche pas si l'on est pas dans le repertoire courant, voici mon script:

bim(){
for x in $(ls -aR)
do
if test -d $x
then
echo $x = repertoire
else
if test -s $x
then
echo $x = fichier non vide
else
echo $x = fichier vide
rm -v $x
fi
fi
done
}
bim


le rm -v me permet de "monitorer" l'etape de la suppression, c'est a dire savoir exactement ce qu'il se passe lors de son execution, et lorsqu'un fichier vide plus haut dans l'arborescence passe par la commande, l'option -v du rm me retourne ceci: "No such file or directory".
Cependant tout se passe bien avec les fichiers vides du repertoire courant, une idée?

Cordiallement, quelqu'un de fatigué ^^D-*

Poste le Friday 2 November 2007 04:06:12
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: oudoubah

Vu l'heure, je comprend que tu soies fatigué ;-)

Ton script n'est pas récursif. Pour pouvoir le terminer, il faut modifier ton script ainsi :
* tu ne testes que les "fichiers" du répertoire courant
* si le "fichier" est un répertoire, tu appelles la fonction bim avec par exemple le nom du répertoire (ou alors, tu utilises les commandes cd pour te positionner avant d'appeler bim)


Conseil : quand tu es en phase de test/débugage d'un script, utilises plutôt "echo rm -v $x" plutôt que "rm -v $x". Imagine qu'il y ait un problème dans ton script, tu pourrais certaines fois arriver à faire par exemple un rm -Rf / (je ne le faisais pas systématiquement avant, et après quelques années d'écriture de scripts, j'en ai un qui a fini par faire ce fameux rm -Rf / en root)

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Friday 2 November 2007 09:15:55
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: GBLL

Merci pour votre reponse, je suis parvenu a pondre ceci:

bim(){
for x in $(ls -a)
do
if test -s $x
then
echo $x = fichier
else
echo $x = fichier vide
echo rm -v $x
fi
done
}

bam(){
for z in $(ls -aR)
do
if test -d $z
then
cd $z
bim
else
bim
fi
done
}

Je n'ai pas les moyens de le tester, l'ordinateur retournant des erreurs de syntaxe
farfelue qui n'interviennent que sur celui-ci, je pourrais le tester sur mon mac cet aprem. eye rolling smiley

Poste le Friday 2 November 2007 11:22:11
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: oudoubah

Pour ton code, est-ce que tu peux le mettre entre les balises de code [co de] et [/co de] (avec l'espace en moins ;-) ) Il sera plus facilement lisible si il est indenté.

Alors, il y a déjà une première erreur : tu as 2 fonctions, mais ni bim, ni bam n'est appelé dans le "main".
Je vais rajouter une petite correction pour ton ls : ls -a liste tous les fichiers et répertoires (avec . et ..). ls -A liste tous les fichiers et répertoires, sauf . et .. Dans ton script, utiliser A au lieu de a te permettra de ne pas te déplacer dans les répertoires parents! Si tu débuggues ton script et que tu laisses un -a, le rm -v se fera sur tous les fichiers vides du système! (d'où ne pas travailler en root, et faire un echo rm comme tu l'as écris dans la nouvelle version ;-))

Sur une arborescence de type :
f1
rep1
rep1/fr1


Imaginons que tu rajoutes un appel à bam au départ : que va faire ton code bam?
Trace-le pour voir ce qui ne va pas :
z=.
test -d f1 vrai => cd . ; bim
bim
x=.
test -s . = faux => echo . = fichier
x=..
test -s .. = faux => echo .. = fichier
x=f1
test -s f1 = faux => echo f1 = fichier vide ; echo rm -v f1
x=rep1
test -s rep1 = faux => echo rep1 = fichier
[fin bim

Je te laisse continuer, pour voir les problèmes que pose ton code.

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Friday 2 November 2007 11:59:12
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: GBL

Sa y est, je l'ai fini :


gbl(){
for x in $(ls -A)
do
if test -d $x
then
echo $x : rep
else
if test -s $x
then
echo $x : file
else
echo $x : vide
rm -f $x
fi
fi
done
}

beta(){
for z in $(ls -A)
do
if test -d $z
then
cd $x;
gbl
else
gbl
fi
done
}

beta

Voila, merci beaucoup a ceux qui nous ont aidé, particulierement à oudoubah, bonne soirée ;-)

Poste le Saturday 3 November 2007 22:45:44
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: GBL

Rectification, le script ne fonctionne que pour un seul dossier plus haut dans l'arborescence, j'ai réglé ce probleme avec le code suivant :

beta(){
for z in $(ls)
do
if test -d $z
then
cd $z;
gbl
else
gbl
fi
done
beta
}

gbl(){
for x in $(ls -A)
do
if test -d $x
then
echo $x : rep
else
if test -s $x
then
echo $x : file
else
echo $x : vide
rm -f $x
fi
fi
done
}

beta

Seulement un probleme se pose, et un probleme de taille, ce script ne s'arrete pas, cependant, lorsque je fais CTRL-C puis un ls -AR, je me rend compte qu'il a effectué tout le boulot que je voulait!

Quelques lumieres sur ce problemes ne serraient pas de refus, je ne vois pas a quel niveau je doit "break" le script ni la commande a utiliser pour le "break".

Peut etre rajouter un if dans la fonction GBL qui permetrais de savoir si il existe ou non des fichiers/repertoires dans le repertoire, et, dans ce cas, arreter le script, ou le continuer si il y a des fichiers/repertoires?

Cordiallement GBL. ^^D-*

Poste le Saturday 3 November 2007 23:21:36
Répondre     Citer    
Re: Shell : supprimer fichiers vides
Envoyé par: oudoubah

Un petit indice pour ton problème de boucle infinie : que fait à la fin ta question beta? ;-)

Ton script est quasiement fini, mais il me semble qu'il y ait quelques erreurs :
Voici un exemple d'arborescence :
.:
rep1/  rep2/  rep3/  sc.sh

./rep1:
f1

./rep2:
f

./rep3:
f3  rep31/

./rep3/rep31:
f4

Comme modification de ton script, j'ai supprimé le rm, et rajouté un "echo REP=$PWD" au début de la fonction gbl, histoire de voir quel répertoire nous sommes en train de traiter. Voici ce que ça donne :
REP=/tmp/fics/rep1
f1 : vide
rm -f f1
REP=/tmp/fics/rep1
f1 : vide
rm -f f1
REP=/tmp/fics/rep1
f1 : vide
rm -f f1
REP=/tmp/fics/rep1
f1 : vide
rm -f f1

Pour te mettre sur la piste, quand tu changes de répertoire (cd $x) tu appelles la fonction gbl à partir du nouveau répertoire, mais tu ne repars jamais plus haut.

Enfin, cet exercice est un bon exemple pour du récursif, et tu peux le faire en une seule fonction (et finalement, c'est plus simple ;-)). Décrit les étapes une par une que doit faire ton script (même les étapes "bateau").

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Sunday 4 November 2007 09:21:21
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Shell : supprimer fichiers vides
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons