Je suis un cours unix et nous survolons les regexp.
J'ai posé une colle à mon prof en lui soumettant un problème qui me taraude depuis longtemps.
Un exemple vaut mieux qu'un long discours
J'ai un répertoire quelconque avec fichiers et répertoire contenant des espaces :
drwxr-xr-x 9 akerba iia1 4096 Apr 19 13:05 Guitar Pro 4
-rw-r--r-- 2 akerba iia1 7880202 Sep 2 14:03 MVI_0045.AVI
drwxr-xr-x 2 akerba iia1 4096 Apr 29 16:57 access
drwxr-xr-x 5 akerba iia1 4096 Feb 27 2004 exercices-vb-net
drwxr-xr-x 19 akerba iia1 4096 Feb 6 2004 tempp
drwxr-xr-x 2 akerba iia1 4096 Feb 27 2004 vb_net
(je vois la colère poindre chez certains, je précise : ce n'est pas mon répertoire !)
. Je veux faire un script, mieux une ligne de commande qui par exemple, va dans chaque répertoire, me fait un du -sh (par exemple) puis revient à la racine.
Donc je tente avec :
for i in `ls | tr ' ' @`; do echo "$i" | sed -e 's/@/\\ /g' ; done
Guitar\ Pro\ 4
MVI_0045.AVI
access
exercices-vb-net
tempp
vb_net
mais quand je fait :
fverny@unixsrv:/home/akerba$ for i in `ls | tr ' ' @`; do cd `echo "$i" | sed -e 's/@/\\ /g'` ; done
bash: cd: Guitar: No such file or directory
bash: cd: MVI_0045.AVI: Not a directory
bash: cd: exercices-vb-net: No such file or directory
bash: cd: tempp: No such file or directory
bash: cd: vb_net: No such file or directory
Ca marche pas ! :((
Quelqu'un a-til une idée, sachant que l'utilisation de @ est une ruse et que je n'ai pas tree ?
Merci !
# Heu
Posté par Pascal Terjan (site web personnel) . Évalué à 2.
ca ne marche pas ?
# En shell ?
Posté par Obsidian . Évalué à 2.
for in in * ; do cd "$i"; du -sh ; cd .. ; done
Cela ne suffirait pas ?
# find?
Posté par popopo333 . Évalué à 4.
[^] # Re: find?
Posté par FReEDoM (site web personnel) . Évalué à 1.
Pourquoi toujours réinventer la roue !
[^] # Re: find?
Posté par popopo333 . Évalué à 1.
ton script te fait essayer de faire un cd dans des repertoires => Not a directory
apres t'arrives au repertoire access => ca marche. t'es dans ce repertoire.
apres ca essaye de faire un cd dans les autres repertoires mais on est encore dans le repertoire access => No such file or directory
en gros c normal quoi...
[^] # Re: find?
Posté par account . Évalué à 1.
find . -type d -maxdepth 1 -exec du -sh {} \;
# fb
Posté par ccomb (site web personnel) . Évalué à 3.
(non je déconne, faites pas ça sur votre machine. Ou alors sauvez tout vos trucs ouverts...)
[^] # Re: fb
Posté par Ontologia (site web personnel) . Évalué à 1.
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
[^] # Re: fb
Posté par popopo333 . Évalué à 1.
[^] # Re: fb
Posté par ut0mt8 (site web personnel) . Évalué à 1.
[^] # Re: fb
Posté par Calim' Héros (site web personnel) . Évalué à 2.
Je donne l'expliquation que m'a donné geo_trouvetout :
":()" => definition de la fct ":"
"{ :|:;}" => corps de la fct : elle s'apelle sur le resultat d'elle meme
";" fin de la cmd
":" apelle de la fct nouvellement definie
Et pan, ca rame...
# IFS=$'\n'
Posté par bobert . Évalué à 2.
Du coup, dès que tu manipules des fichiers dont le nom possède des espaces, ça fout la caille. Et d'ailleurs, un tel script devrait toujours prévoir ce cas de figure.
On peut changer le comportement du shell en modifiant la valeur de la variable IFS (Input Field Separator)
La ligne de commande shell qui correspond à ce que tu voulais est:
IFS=$'\n' && for dir in `ls -d */`; do cd $dir && du -sh && cd ..; done && unset IFS
Pour des scripts remplissant des tâches administratifs, ça a plus de sens de nos jours (à mon humble avis) de les écrire en python. C'est simple à écrire, lisible, facile à maintenir, et on s'affranchit de beaucoup de côtés obscur du shell, dont celui-ci.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.