Как я могу проверить, почему команда 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 - а также для сравнения с sudo, который потерпел неудачу после создания 78KB страничного журнала).

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

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

3
задан 3 April 2016 в 17:14

1 ответ

Можно считать вывод. diff не дает различные коды статуса выхода кроме:

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

(от разности человека)

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

От небольшого тестирования с помощью разности (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 для обнаружения, каковы проблемы.

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


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

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

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

Для игнорирования некоторых файлов при сравнении каталогов используйте --exclude=pattern (-x pattern) опция

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

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

1
ответ дан 4 April 2016 в 03:14
  • 1
    @Jost ответ корректен. В той же файловой системе, mv просто вызовы rename(), тогда как, в то время как mv - луг между файловыми системами, содержание сначала копируется read() с write() с, только после того, как они становятся успешными, файл unlink() - редактор из исходного каталога. – heemayl 12 August 2017 в 02:51

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

Похожие вопросы: