Citation
Rémi G.
1) Comment ne renvoyer que le nom des fichiers
défectueux?
Comment tu sais qu'un fichier est défectueux ??? Répond à cette question et essaye de la traduire en algorithme simple que tu traduiras ensuite en shell
Citation
Rémi G.
2) Pourquoi la ligne suivante ne marche pas :
find répertoire -name *.flac | xargs -i flac -t "{}" >> fichier
Parce que t'as lu ni le man de "find" ni le man de "xargs"
Les accolades {} sont associées à find et non à xargs. elles symbolisent le nom du fichier.
Par exemple, si tu veux lancer une copie de tous les fichiers de /home dans /tmp, il te faudra à un moment donné faire "cp". Mais la commande "cp" prend 2 paramètres: le fichier d'origine et le dossier de destination. Comment tu indiques à find où placer le nom du fichier en paramètre ? Grâce aux accolades
find /home -type f -exec cp {} /tmp \:
Citation
Rémi G.
3) Pourrais-tu me donner quelques détails sur la commande "xargs", je n'ai rien compris (ou presque) à la page de manuel!
C'est vrai que "xargs" est une commande un peu compliquée car c'est une commande qui sert à lancer une autre commande !!!
Exemple simple: Imagine que tu veulles faire un "rm -f" de tous les fichiers situés dans une liste.
Syntaxe de base:
rm -f `cat liste`
Ou bien
rm -f $(cat liste)
Dans ce genre de syntaxe, le shell commence par faire "cat liste" ce qui renvoie à l'écran toute une liste de noms puis fait "rm -f <la_liste_de_noms>". Si cette liste est trop longue, "rm" refuse car toute commande possède une limite en terme de nombre d'arguments. Solution: Mettre le "rm -f" dans une boucle sur chaque nom.
Pour améliorer le travail des utilisateurs, les pro Unix ont créé la commande "xargs" qui se charge elle-même de la boucle. Il ne te reste plus qu'à lui passer la commande à effectuer car xargs ne la connait pas !!!
cat liste |xargs rm -f
Citation
Rémi G.
# Etape 2 : recherche du nombres de fichiers de la
liste (i.e du nombre de lignes du fichier /tmp/testflac$$)
n=($(wc -l /tmp/testflac$$)) && n=${n[0]}
4) Y-a-t-il une autre façon de compter les lignes dans l'étape 2?
Bien sûr. Tu écrits "n=${n[0]}" parce que t'as bien remarqué que "wc -l fic" te donne à l'écran le nb de lignes suivi du nom de fichier et que toi, tu ne désires que le nb de lignes.
Mais t'as pas tenté de voir ce que donne "cat /tmp/testflac$$ |wc -l" ??? Ben comme "wc" ne reçoit pas de fichier mais une entrée standard il ne t'affiche aucun nom !!!
Citation
Rémi G.
5) Je n'ai pas réussi à imbriquer les commandes
"tail" et "head" en niveaux de sous-execution dans
l'étape 3.1... Comment faire? J'ai essayé ceci
:fichier=$(head -n1 $(tail -n$i /tmp/testflac$$))
Tu n'as pas encore bien perçu la signification de "$(commande)"
Quand tu écris "... $(commande) ...", le shell exécute la ligne en remplaçant "$(commande)" par "tout ce que la commande affiche"
Ex: a=$(pwd) => Le shell exécute "a=xxx", la chaîne "xxx" provenant de l'affichage de la commande "pwd".
Donc si tu écrits "head -n1 $(tail -n$i /tmp/testflac$$)"
Le shell voit "head -n1 xxx", ce "xxx" provenant de la commande "tail" c.a.d. une liste de lignes.
Mais l'argument qu'on donne à "head" n'est pas sensé être une suite de lignes, c'est censé être un nom de fichier !!!
Si tu veux enchaîner deux commandes, c'est à dire donner à manger à la commande de droite ce que la commande de gauche écrit, faut utiliser le pipe !!!
fichier=$(tail -n$i /tmp/testflac$$ |head -n1)
Citation
Rémi G.
Pour la dernière méthode que tu me proposes (la plus complexe), je vais attendre de finir de lire ton cours pour essayer parce que j'avoue que je ne pige pas tout lol
Je te conseille de bien comprendre le principe.
Il faut commencer par te souvenir que chaque script, chaque programme Unix possède 3 canaux IO numérotés 0, 1 et 2.
Ensuite, il te faut juste savoir que, grâce à "exec", il t'est possible de créer d'autres canaux à volonté (jusqu'à 64 si mes souvenirs sont bons mais ça peut avoir changé) associés à des fichiers; les canaux input étant symbolisés par "<", lex canaux output étant symbolisés par ">". Et comme les chiffres 0, 1 et 2 sont déjà utilisés, le n° suivant utilisable est le 3. Donc tu peux créer des canaux numérotés de 3 à 64.
Exemple
exec 3</etc/passwd # Associe le canal 3 en input au fichier "/etc/passwd"
exec 4 >toto # Associe le canal 4 en output au fichier "toto"
Ensuite, dès que tu veux écrire dans un canal, il te suffit de dire "je redirige le flux 1 (ou 2) vers le canal de mon choix en utilisant le signe "&" bien connu des programmeurs de "C" signifiant "adresse de".
Exemple
echo "salut" 1>&4 # Tout ce qui passe normallement par le canal 1 ira dans le 4 c.a.d. dans le fichier "toto"
Et si tu veux lire une info prise dans le fichier "/etc/passwd", il te suffit de dire "tout ce que je lis sera pris à partir du canal 3"
Exemple
read var 0<&3
# Toute ligne sensée être lue depuis le clavier et stockée dans "var" sera en fait lue depuis le tampon 3 contenant à l'origine "/etc/passwd"
# Dans le même temps, ce tampon mémoire perdra la ligne lue (mais "/etc/passwd" n'est pas affecté)
Une fois ceci bien assimilé, tu peux l'utiliser ou pas suivant ton besoin. Je t'ai expliqué le danger de la redirection en fin de "done", où toute lecture clavier placé dans la boucle sera elle-aussi prise dans la redirection. si t'es pas géné par ce pb possible parce que tu ne fais pas de lecture clavier, tu peux sans soucis utiliser la méthode de redirection simple sans créer de canal spécialisé...
L'homme qui murmurait à l'oreille des pingouins
[
fr.lang.free.fr]