2010-02-24 5 views
0

Je rencontre des problèmes assez inhabituels en utilisant grep dans un script bash. Voici un exemple du code de script bash que j'utilise que présente le comportement:Problèmes avec la commande Grep dans le script bash

UNIQ_SCAN_INIT_POINT=1 
cat "$FILE_BASENAME_LIST" | uniq -d >> $UNIQ_LIST 
sed '/^$/d' $UNIQ_LIST >> $UNIQ_LIST_FINAL 
UNIQ_LINE_COUNT=`wc -l $UNIQ_LIST_FINAL | cut -d \ -f 1` 
while [ -n "`cat $UNIQ_LIST_FINAL | sed "$UNIQ_SCAN_INIT_POINT"'q;d'`" ]; do 
    CURRENT_LINE=`cat $UNIQ_LIST_FINAL | sed "$UNIQ_SCAN_INIT_POINT"'q;d'` 
    CURRENT_DUPECHK_FILE=$FILE_DUPEMATCH-$CURRENT_LINE 
    grep $CURRENT_LINE $FILE_LOCTN_LIST >> $CURRENT_DUPECHK_FILE 
    MATCH=`grep -c $CURRENT_LINE $FILE_BASENAME_LIST` 
    CMD_ECHO="$CURRENT_LINE matched $MATCH times," cmd_line_echo 
    echo "$CURRENT_DUPECHK_FILE" >> $FILE_DUPEMATCH_FILELIST 
    let UNIQ_SCAN_INIT_POINT=UNIQ_SCAN_INIT_POINT+1 
done 

À de nombreuses occasions, quand grep pour la ligne courante dans la liste de l'emplacement du fichier, il a mis aucune sortie au courant fichier dupechk même s'il y a certainement eu des correspondances avec la ligne courante dans la liste des emplacements de fichiers (j'ai exécuté la commande dans le terminal sans problème). J'ai fouillé autour de l'Internet pour voir si quelqu'un d'autre a eu un comportement similaire, et jusqu'ici tout ce que j'ai trouvé, c'est que ça a quelque chose à voir avec les sorties tamponnées et non tamponnées des autres commandes opérant avant la commande grep dans le Bash script ....

Cependant personne ne semble avoir trouvé une solution, donc en gros je vous demande si vous avez déjà rencontré cela, et toute idée/conseils/solutions à ce problème ...

Cordialement

Paul

+0

Qu'essayez-vous précisément de faire? Nous pourrions peut-être proposer un meilleur moyen de s'y prendre. –

+0

J'ai un script bash très long qui doit effectuer l'opération de localisation de fichiers dupliqués dans un répertoire donné. Cette partie du script recherche les doublons et les imprime dans un fichier. Il est intéressant de noter que je fais cela pour un cours universitaire et que la commande awk n'est pas autorisée. – paultop6

+0

La commande awk n'est pas autorisée mais sed/grep l'est? lol – ghostdog74

Répondre

1

Le `problème 'est la bibliothèque d'E/S standard. Quand il écrit dans un terminal , il n'est pas tamponné, mais s'il écrit dans un tube, il met en place un tampon.

essayer de changer

CURRENT_LINE=`cat $UNIQ_LIST_FINAL | sed "$UNIQ_SCAN_INIT_POINT"'q;d'` 

à

CURRENT LINE=`sed "$UNIQ_SCAN_INIT_POINT"'q;d' $UNIQ_LIST_FINAL` 
+0

Gareautrain. Je comprends maintenant que vous l'avez expliqué, mais je n'aurais jamais pensé à ça autrement, merci! – paultop6

0

Y a-t-il des répertoires avec des espaces dans leurs noms dans $FILE_LOCTN_LIST? Parce que s'ils le sont, ces espaces devront s'échapper d'une manière ou d'une autre. Une combinaison de find et xargs peut généralement gérer cela pour vous, en particulier xargs -0

+0

J'utilise actuellement cette commande pour compiler $ FILE_LOCTN_LIST: echo $ SCAN_DIRNAME | xargs -I {/} find {/} -type f $ $ FILE_LOCTN_LIST Je pense que xargs -I est similaire à xargs -0? – paultop6

+0

Ok, donc ça ne va pas s'échapper si c'est le nom d'un seul fichier. –

0

Un petit script bash en utilisant md5sum et tri qui détecte les fichiers en double dans le répertoire courant:

CURRENT="" md5sum * | 
    sort | 
    while read md5sum filename; 
    do 
    [[ $CURRENT == $md5sum ]] && echo $filename is duplicate; 
    CURRENT=$md5sum; 
    done 
0

vous linux tagged certains Je suppose que vous avez des outils comme GNU trouver, md5sum, uniq, trier, etc. Voici un exemple simple pour trouver dupliqué f iles

$ echo "hello world">file 
$ md5sum file 
6f5902ac237024bdd0c176cb93063dc4 file 
$ cp file file1 
$ md5sum file1 
6f5902ac237024bdd0c176cb93063dc4 file1 
$ echo "blah" > file2 
$ md5sum file2 
0d599f0ec05c3bda8c3b8a68c32a1b47 file2 
$ find . -type f -exec md5sum "{}" \; |sort -n | uniq -w32 -D 
6f5902ac237024bdd0c176cb93063dc4 ./file 
6f5902ac237024bdd0c176cb93063dc4 ./file1 
Questions connexes