Как я могу проверить, почему команда diff потерпела неудачу?

Я бегал diff --brief -r /home/mateusz/ /media/mateusz/Database/backup_test_tmp_folder/home/mateusz/ команда, которая завершилась с кодом ошибки 2. Согласно документации "Состояние выхода равно 0, если входы одинаковы, 1, если отличается, 2, если проблема".

К сожалению, команда вышла без объяснения, почему это не удалось. Я попытался использовать straces, но, к сожалению, я не могу ничего диагностировать на основе созданного журнала (последние 150 строк файла strace размером 3,5 ГБ размещены на https://gist.github.com/matkoniecz/15ed855bd3f161ad6354c7d637234804 - а также для diff, работающего с sudo который потерпел неудачу после производства 78KB журнала регистрации).

Я подумал об изменении команды diff для вывода некоторого объяснения, прежде чем умереть и вернуть 2, но, учитывая, что маловероятно, что моя программа уникальна, отсутствие поддержки такой отладки, по-видимому, указывает на то, что есть более эффективные решения (надеюсь, это не "научиться интерпретировать" Трассирование ").

Итак, как я должен проверить, почему моя команда diff провалилась? Есть ли лучший инструмент, чем strace или добавление отладки printf в команду diff?

1 ответ

Решение

Вы можете прочитать вывод. diff не дает другие коды состояния выхода, кроме:

  • 0, если входы одинаковы,
  • 1, если отличается,
  • 2 если проблема.

(от разницы)

"Проблема" означает, что он не может прочитать файл или что-то еще.

После небольшого тестирования с использованием diff (GNU diffutils) 3.3 и сравнения папок, diff выводит сообщения в stdout или stderr:

  • Если один файл отсутствует, то выходной статус равен 1, и это появляется в stdout:

    Only in folder1: file-a
    
  • Если один файл не читается, то выходной статус равен 2, и это появляется в stderr:

    diff: folder1/file-b: Permission denied
    

(Если происходят обе ошибки, статус выхода равен 2.)

Итак, прочитайте / проанализируйте stdout и stderr, чтобы выяснить, в чем проблемы.

Обратите внимание, что diff продолжит обрабатывать другие файлы после возникновения "неполадки", поэтому строка, сообщающая причину состояния выхода 2, может находиться в любой части вывода.


См. Эту ссылку GNU "руководство по diffutils" для получения дополнительной информации о сравнении каталогов (и использовании diff в целом, это безумно более подробно, чем просто man diff). Информация как:

... если вы используете --report-identical-files (-s), он сообщает пары идентичных файлов

Если существует только один файл, diff обычно не показывает его содержимое; он просто сообщает, что один файл существует, а другой нет. Вы можете заставить diff действовать так, как если бы отсутствующий файл был пустым, чтобы он выводил все содержимое файла, который фактически существует... используйте --new-file (-N)... Если старый каталог содержит большие файлы, которых нет в новом каталоге, вы можете уменьшить размер патча, используя --unidirectional-new-file вариант вместо -N,

Чтобы игнорировать некоторые файлы при сравнении каталогов, используйте --exclude=pattern (-x pattern) вариант

Если вы сравнивали два каталога и остановились на полпути, позже вы можете продолжить с того места, где остановились. Вы можете сделать это с помощью --starting-file=file (-S file) вариант. Это сравнивает только файл file и все файлы в алфавитном порядке в верхнем уровне каталога.

Или эти связанные Q с других сайтов:

Другие вопросы по тегам