Как я могу проверить, почему команда 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 с других сайтов: