web-dev-qa-db-fra.com

Comment puis-je vérifier pourquoi la commande diff a échoué?

J'exécutais la commande diff --brief -r /home/mateusz/ /media/mateusz/Database/backup_test_tmp_folder/home/mateusz/ qui s'est terminée avec le code d'erreur 2. Selon la documentation, l'état de sortie est égal à 0 si les entrées sont identiques, 1 si différent, 2 si incident.

Malheureusement, la commande est sortie sans donner la moindre idée de la raison de son échec. J'ai essayé d'utiliser straces mais malheureusement, je ne parviens pas à diagnostiquer quoi que ce soit en fonction du journal produit (les 150 dernières lignes du fichier strace de 3,5 Go sont postées sur https://Gist.github.com/matkoniecz/15ed855bd3f161ad6354c7d637234804 - et également pour diff avec Sudo qui échouait après la production de 78 Ko de journal strace).

J'ai envisagé de modifier la commande diff pour produire une explication avant de mourir et de retourner 2, mais étant donné qu'il est peu probable que mon programme soit unique, le manque de prise en charge d'un tel débogage semble indiquer qu'il existe de meilleures solutions (espérons que ce n'est pas strace ").

Alors, comment je suis censé vérifier pourquoi ma commande diff a échoué? Existe-t-il un meilleur outil que strace ou l’ajout de printf debugging à la commande diff?

3

Vous pouvez lire le résultat. diff ne donne pas d'autres codes de statut de sortie autres que:

  • 0 si les entrées sont les mêmes,
  • 1 si différent,
  • 2 si le problème.

(de man diff )

"Trouble" signifie qu'il ne peut pas lire un fichier, ou presque rien d'autre.

Après quelques essais en utilisant diff (GNU diffutils) 3.3 et en comparant les dossiers, diff envoie les messages à stdout ou stderr:

  • Si un fichier est manquant, le statut de sortie est 1 et apparaît sur stdout :

    Only in folder1: file-a
    
  • Si un fichier est illisible, l'état de sortie est 2 et apparaît sur stderr :

    diff: folder1/file-b: Permission denied
    

(Si les deux erreurs se produisent, le statut de sortie est 2.)

Alors, lisez/analysez stdout et stderr pour savoir quels sont les problèmes.

Notez que diff continuera à traiter d’autres fichiers après avoir rencontré un "problème", de sorte que la ligne indiquant le motif de l’état de sortie 2 peut se trouver à n’importe quelle partie de la sortie.


Voir ce lien "Manuel diffutils" de GN pour plus d’informations sur la comparaison de répertoires (et l’utilisation de diff en général, c’est incroyablement plus détaillé que man diff). Info comme:

... si vous utilisez l'option --report-identical-files (-s), il renvoie des paires de fichiers identiques

Si un seul fichier existe, diff ne montre normalement pas son contenu; il signale simplement qu'un fichier existe, mais pas l'autre. Vous pouvez faire en sorte que diff agisse comme si le fichier manquant était vide, de sorte qu'il affiche tout le contenu du fichier qui existe réellement ... utilisez --new-file (-N) ... Si l'ancien répertoire contient Pour les fichiers volumineux qui ne figurent pas dans le répertoire le plus récent, vous pouvez réduire la taille du patch en utilisant l’option --unidirectional-new-file à la place de -N.

Pour ignorer certains fichiers lors de la comparaison de répertoires, utilisez l'option --exclude=pattern (-x pattern).

Si vous avez comparé deux répertoires et que vous vous êtes arrêté en cours de route, vous voudrez peut-être continuer là où vous l'avez laissé. Vous pouvez le faire en utilisant l’option --starting-file=file (-S file). Ceci compare uniquement le fichier fichier et tous les fichiers ultérieurs par ordre alphabétique au niveau de répertoire le plus élevé.

Ou ces Q connexes des autres sites:

1
Xen2050