2010-11-05 18 views
0

on me demande de diff deux répertoires en utilisant Perl mais je pense que quelque chose ne va pas avec ma commande,Pourquoi cette commande ne prend-elle pas le diff de deux répertoires?

$diff = system("sudo diff -r '/Volumes/$vol1' '/Volumes/$vol2\\ 1/' >> $diff.txt"); 

Il n'affiche pas et la sortie. Quelqu'un peut il m'aider avec ça? Merci!

+0

Je suspecte les noms de répertoire. S'il vous plaît les poster. –

+0

"On me demande" - est ce devoir? – Ether

Répondre

0

Est-ce que sudo diff est invité à entrer un mot de passe? Si possible, supprimez le sudo de l'invocation de diff, et exécutez votre script avec sudo.

-1

Vous voudrez peut-être vérifier Test::Differences pour une implémentation diff plus flexible.

+0

Ce module effectue des différences sur * les structures de données *, et non sur les fichiers, et dans le contexte d'un framework Test :: Builder, ce qui n'est absolument pas ce qui a été demandé. – Ether

3

Il semble que vous souhaitiez stocker toutes les différences dans une chaîne.

Si tel est le cas, la commande de la question ne va pas travailler pour quelques raisons:

  • Il est difficile de dire si elle est destinée ou non, mais la variable $diff est utilisée pour Définir le nom de fichier qui stocke les différences. Peut-être que cela devrait être diff.txt, pas $diff.txt

  • Le résultat de la commande est enregistrée dans diff$diff.txt. Il n'affiche rien dans STDOUT. Cela peut être corrigé en omettant la partie >> $diff.txt. Si elle doit également être stocké dans le fichier, pensez à la commande tee:

    sudo diff -r dir1/ dir2/ | tee diff.txt 
    
  • Lorsqu'un appel est system affecté à une variable, elle retourne 0 en cas de succès. Pour citer la documentation:

    La valeur de retour est le statut de sortie du programme tel que renvoyé par l'appel wait.

    Cela signifie que $diff ne stocke pas les différences, mais l'état de sortie de la commande. Une approche plus sensée serait d'utiliser des backticks. Faire cela permettra $diff pour stocker tout ce qui est STDOUT par la commande:

    my $diff = `sudo diff -r dir1/ dir2/ | tee diff.txt`; # Not $diff.txt 
    
  • Est-il indispensable d'utiliser la commande sudo? Évitez d'utiliser si possible même à distance:

    my $diff = `diff -r dir1/ dir2/ | tee diff.txt`; # Not $diff.txt 
    

Une recommandation finale

Laissez un bon module CPAN prendre soin de cette tâche, que les appels backtick ne peuvent aller aussi loin. Certains ont déjà été suggérés ici; ça vaut peut-être le coup d'oeil.

0

"Il ne s'affiche pas et ne sort pas." - C'est parce que vous enregistrez les différences dans un fichier, puis (probablement) ne rien faire avec ce fichier résultant.

Cependant, je m'attends à ce que "diff deux répertoires utilisant Perl" ne signifie pas "utiliser system() pour le faire dans le shell, puis capturer les résultats".Avez-vous envisagé de le faire dans la langue elle-même? Par exemple, voir Text::Diff. Pour un contrôle plus nuancé sur ce qui constitue une «différence», vous pouvez simplement lire dans chaque fichier et créer votre propre algorithme pour effectuer les comparaisons et compiler les similitudes et les différences.