Как рекурсивно бок о бок diff каталоги с номерами строк в diff в unix?

Мой сценарий состоит в том, чтобы выполнять параллельные каталоги diff, используя:

diff -ry <folder1> <folder2> 

наряду с номерами линий на выходе diff . По умолчанию номера строк не отображаются в боковом --new-line-format а параметр --new-line-format не работает, а diff -y работает только с diff -u .

Что я пытался сделать [Только для файлов]:

 diff -y <(cat -n file1) <(cat -n file2) 

для генерации номеров строк. Вышеприведенная команда сначала генерирует номера строк, а затем передает ее команде diff, поэтому номера строк сохраняются неповрежденными в результате diff.

Но когда дело доходит до использования diff -ry , я не могу добиться того же. Есть ли способ применить cat -n, используя что-то вроде xargs [как препроцессор] в команде diff -ry ?

2 Solutions collect form web for “Как рекурсивно бок о бок diff каталоги с номерами строк в diff в unix?”

Вы можете преобразовать вывод inline diff -ru в параллельное представление с номерами строк и цветом с помощью программы python cdiff также известной как cdiff.py (не путать с оберткой cdiff которая является частью colordiff ), путем Мэтью Ван.

Следуйте любым из предложенных способов установки, указанных в ссылке, или просто извлеките скрипт cdiff.py из загрузки в ваш PATH, затем вы можете сделать

 diff -ru dir1 dir2 | cdiff.py -s 

Стивен Харрис дал очень хороший ответ на предыдущую версию этого вопроса . К сожалению, он не может справиться с патологическим случаем имен файлов с новыми символами в них. Вот небольшая адаптация его ответа, который обрабатывает этот случай. (Я также изменил его, чтобы использовать cat -n вместо nl , и использовать параметр -y для diff .)

 find folder1 -type f -exec bash -c 'for file1 do file2="${file1/folder1/folder2}" echo "Comparing $file1 to $file2" diff -y <(cat -n "$file1") <(cat -n "$file2") done' bash {} + 

Поскольку вы попросили решение xargs в комментарии по поводу ответа Стивена, вот вы:

 find folder1 -type f -print0 | xargs -0 bash -c 'for file1 do file2="${file1/folder1/folder2}" echo "Comparing $file1 to $file2" diff -y <(cat -n "$file1") <(cat -n "$file2") done' bash 

Обратите внимание, что эти команды должны выполняться в bash , потому что оболочка POSIX не поддерживает ${ parameter / pattern / string } , а решение xargs должно выполняться на GNU-land, потому что POSIX не поддерживает find -print0 или xargs -0 . (Конечно, вы могли бы заменить -print0 на -print и сбросить -0 , но тогда вы потеряете возможность обрабатывать имена файлов с новыми символами в них.)

  • Как рассказать xargs, какой аргумент выбрать?
  • Как я могу создать файл, который я получил из stdin без xargs
  • Почему «{}» и «%» обычно используются как переменные в xargs?
  • Формат вывода xargs
  • Мне нужно "| xargs -n 1 ", чтобы обойти xargs -I побочный эффект?
  • Использовать xargs вместо псевдонимов
  • xargs: Имеет ли порядок вариантов?
  • Безопасный поиск и удаление файлов
  • Измените код ASP на PHP-код во всех файлах
  • передавая переменные от 'ls' до 'tar' через 'xargs'
  • Утилита, полезная для работы с памятью, возвращает N первых отсортированных значений
  • Linux и Unix - лучшая ОС в мире.