aide correction script bash

aide correction script bash - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 25-11-2003 à 09:20:27    

voila, je dois toujours faire un script qui 'donne les fichiers en double du répertoire courant' en bash, pour apprendre, même si des utilitaires C existent ;)
 
donc la j'ai pondu un "script" qui d'arès moi devrait marcher, d'apres les morceaux d'élements que j'ai réussi a chopper par ci par la, mais évidemment ça marche pas  donc si vous pouviez m'aider...
 
(oui c pas élégant mais j'en suis au stade de l'apprentissage)
 
donc je liste les fichiers du répertoire, les trie par ordre de taille, et les teste 2 à 2 avec diff ( complexité linéaire)

#!/bin/bash
 
#cree une liste des fichiers triee par odre de taille
TOTO=`ls -l $1| grep -vE ^d | sort -nk 5 | awk '{print $8}'`
 
#donne le nombre d'elements ( de fichiers)
NB_FICHIERS=`echo $TOTO | wc -w`
 
#prend le premier element
PREC=`echo $TOTO|awk '{print $1}'`
 
#initialise la boucle
I=2
 
#on boucle tant qu'on a pas teste le dernier fichier
until test $I -ge $NB_FICHIERS
do
#on selectionne le i-ème fichier
FICHIER_COURANT=`echo $TOTO|awk '{print $'$I'}'`
#si les fichiers sont identiques ( diff ne retourne rien)
if test -z `diff $PREC $FICHIER_COURANT`
then
echo "les fichiers $PREC et $FICHIER_COURANT sont identiques"
fi
PREC=$FICHIER_COURANT
I=`expr $I + 1`
done


j'ai corrigé 2-3 errerus de syntaxe et betes, mais j'ai une erreur ./dascript: line 16: test: -ge: unary operator expected que je ne comprend pas


Message édité par farib le 25-11-2003 à 10:30:32

---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 25-11-2003 à 09:20:27   

Reply

Marsh Posté le 25-11-2003 à 09:44:18    

Hum, bizarre, c'est moi le script passe nickel.
 
T'es sous quoi ??


Message édité par Cruchot le 25-11-2003 à 09:44:31
Reply

Marsh Posté le 25-11-2003 à 09:46:20    

nan tu te fous de ma gueule, chez toi ça passe ? :ouch: :heink:


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 25-11-2003 à 09:46:32    

ben tu dois avoir un guillement non-fermé ...
 
je viens de faire un copier-coller sous emacs, et je vois tout de suite l'erreur !!!
 
#prend le premier element
PREC=`echo $TOTO|awk '{print $1}'
 
il manque un ` à la fin de cette ligne :pfff:

Reply

Marsh Posté le 25-11-2003 à 09:49:34    

farib a écrit :

nan tu te fous de ma gueule, chez toi ça passe ? :ouch: :heink:


 
Ah bien j'ai pris que les 12 dernieres lignes donc c'est normal que ca passe :lol:
 
Sinon oui il manque un `

Reply

Marsh Posté le 25-11-2003 à 10:06:47    

Heuu juste comme ça en passant, tu as pas mal d'erreur dans ton script :/
 
qualques pistes :
 - tu incrémentes jamais i, ça boucle à l'infini -> man expr
 - la variable i n'est pas la même que I
 - awk '{print $$I}' : apparemment, tu veux que awk interprete print ${la valeur de I}, dans ce cas, il faut évaluer $I, il faut donc fermer et réouvrir tes quotes, ça donne : awk '{print $'$I'}'
 
bon courage :)

Reply

Marsh Posté le 25-11-2003 à 10:14:54    

corrigé ( je vais y arriver, je vais y arriver...)
 
bon zut I=$I+1 ça marche pas comme ça, faut que je fasse évaluer la valeur numérique


Message édité par farib le 25-11-2003 à 10:25:58

---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 25-11-2003 à 10:28:47    

oui

Citation :

-> man expr

;)

Reply

Marsh Posté le 25-11-2003 à 10:43:16    

arf, je vais assayer d'insérer des guillements pour pas que awk se rate avec les noms de fichiers avec espaces
 

TOTO=`ls -l $1| grep -vE ^[dl]| sort -nk 5 | awk '{print $8}' | sed s/\(.*\)/\\"$1\\"/g`


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 25-11-2003 à 11:01:29    

Oula ya des erreurs partout.
Une variable contenant un nom de fichier en bash doit toujours être protégé avec des guillemets (même avec ça, on a des problèmes si le nom de fichier contient des sauts de lignes...).
Mon avis est que ce script est inutilement compliqué et serait plus simple à écrire en perl ou en awk. Admettons que tu fasses ça pour t'amuser. Je te conseille tout de même de le faire en perl après ;)
 
Pour sélectionner un fichier dans ta liste, utilise sed :
echo "$TOTO" | sed -ne ${I}p
(en bash tu as des tableaux mais en sh je ne suis pas sur)
 
De plus ton algo ne fonctionne pas : tu peux avoir 3 fichiers A, B et C de taille identique avec A=C. Tu ne testes ici que A!=B et B!=C...
Il faut comparer deux à deux les fichiers de taille identique.
Fais des fonctions shell pour plus de clareté dans ton code, ça va devenir compliqué :)

Reply

Marsh Posté le 25-11-2003 à 11:01:29   

Reply

Marsh Posté le 25-11-2003 à 11:05:30    

farib a écrit :

arf, je vais assayer d'insérer des guillements pour pas que awk se rate avec les noms de fichiers avec espaces


Mauvaise idée, si tu veux protéger un nom de fichier, il faut plutôt échapper tous les caractères. Si tu as des guillemets dans ton nom de fichier, ça va poser pb (nb : ça ne résoud toujours pas le problème des saut de lignes ici).

Code :
  1. echo toto | sed -e 's/\(.\)/\\\1/g'



Message édité par arsunik le 25-11-2003 à 11:05:48
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed