Сравнение содержимого двух файлов

У меня есть два файла, содержащие список всех путей файлов с двух жестких дисков (предполагается, что они точно такие же), один из которых, я думаю, имеет недостающие файлы.

Есть ли команда, которая может сравнивать разницу между этими двумя файлами и выводить разницу в один и тот же порядок (см. Пример ниже). новый файл?

Пример:

file1:

/docs/red /docs/blue /docs/yellow /docs/green

file_2:

/docs/blue /docs/green /docs/red

Difference_File:

/docs/yellow
5
задан 1 May 2018 в 08:26

10 ответов

Я обычно использую meld (это очень полезный инструмент визуального разграничения) для таких сравнений.

Установите meld:

sudo apt-get install meld

Сортировка, а затем сравните:

sort csv1.txt > csv1-sorted.txt sort csv2.txt > csv2-sorted.txt meld csv1-sorted.txt csv2-sorted.txt
4
ответ дан 17 July 2018 в 15:36

Я бы попытался использовать sort и diff:

$ diff <(sort csv1.txt) <(sort csv2.txt) 4d3 < 8d6 < /docs/yellow
6
ответ дан 17 July 2018 в 15:36

если ваш реальный вопрос заключается в том, как сравнить две смонтированные файловые системы я буду использовать rsync.

см.: сравнить каталоги по rsync? на Unix и Linux

Вы можете использовать -n (--dry-run), не вызывает никакого файлов, чтобы на самом деле быть скопированы, то на выходе разницы. Это, по умолчанию также будет показывать если файл новее, чем другой, т. е. его содержимое изменилось. Я довольно уверен, что он может быть настроен так, чтобы игнорировать содержимое файла.

1
ответ дан 17 July 2018 в 15:36

Команда comm предназначена для ответа на этот вопрос. Для этого нужно взять два отсортированных файла в качестве ввода, затем вывести три столбца текста: строки, уникальные для файла1, строки, уникальные для файла2, и строки, общие для обоих файлов. Вы можете подавить любой из этих трех столбцов.

В вашем случае вам понадобится что-то вроде:

comm <(sort file1) <(sort file_2) -3 --output-delimiter=''

Который будет сравнивать file1 и file_2, а затем выводит все существуют различия в стандартном выпуске. Используйте -23 (подавлять столбцы 2 и 3), если вы хотите, чтобы линии были уникальными для file1 или -13 (подавление столбцов 1 и 3), если вы хотите, чтобы линии были уникальными для file_2

3
ответ дан 17 July 2018 в 15:36

Используйте grep и не нужно сортировать их:

grep -Fxvf file2 file1 > diff_file

вернет строки, которые находятся в файле1, но не в файле2 (строки, пропущенные в файле2).

9
ответ дан 17 July 2018 в 15:36

Я обычно использую meld (это очень полезный инструмент визуального разграничения) для таких сравнений.

Установите meld:

sudo apt-get install meld

Сортировка, а затем сравните:

sort csv1.txt > csv1-sorted.txt sort csv2.txt > csv2-sorted.txt meld csv1-sorted.txt csv2-sorted.txt
4
ответ дан 23 July 2018 в 16:33
  • 1
    Использование замещения процесса сэкономит вам два inodes и соответствующее дисковое пространство (за счет памяти). – heemayl 1 May 2018 в 14:11
  • 2
    Дополнительным преимуществом использования meld является его способность сравнивать каталоги. Поскольку вы сравниваете текстовые файлы, содержащие имена файлов, возможно, вы можете просто запустить meld в каталогах и самих файлах. – 64pi0r 1 May 2018 в 15:47

Я бы попытался использовать sort и diff:

$ diff <(sort csv1.txt) <(sort csv2.txt) 4d3 < 8d6 < /docs/yellow
6
ответ дан 23 July 2018 в 16:33
  • 1
    colordiff облегчает чтение вывода, а также добавляет некоторые опции, поскольку -c - хорошая идея. Вы можете сортировать файлы на лету таким образом: colordiff -c <(sort csv1.txt) <(sort csv2.txt) – pa4080 1 May 2018 в 08:55

Если ваш реальный вопрос заключается в том, как сравнить две смонтированные файловые системы, я бы использовал rsync.

См .: Rsync сравнить каталоги? на Unix & amp; Linux

Вы можете использовать -n (--dry-run), чтобы не копировать файлы на самом деле, а выход - различия. Это, по умолчанию, также покажет, является ли один файл более новым, чем другое, то есть изменилось ли содержимое. Я уверен, что он может быть настроен на игнорирование содержимого файла.

1
ответ дан 23 July 2018 в 16:33

Команда comm предназначена для ответа на этот вопрос. Для этого нужно взять два отсортированных файла в качестве ввода, затем вывести три столбца текста: строки, уникальные для файла1, строки, уникальные для файла2, и строки, общие для обоих файлов. Вы можете подавить любой из этих трех столбцов.

В вашем случае вам понадобится что-то вроде:

comm <(sort file1) <(sort file_2) -3 --output-delimiter=''

Который будет сравнивать file1 и file_2, а затем выводит все существуют различия в стандартном выпуске. Используйте -23 (подавлять столбцы 2 и 3), если вы хотите, чтобы линии были уникальными для file1 или -13 (подавление столбцов 1 и 3), если вы хотите, чтобы линии были уникальными для file_2

3
ответ дан 23 July 2018 в 16:33

Используйте grep и не нужно сортировать их:

grep -Fxvf file2 file1 > diff_file

вернет строки, которые находятся в файле1, но не в файле2 (строки, пропущенные в файле2).

8
ответ дан 23 July 2018 в 16:33
  • 1
    Хорошее решение, которое идеально подходит для вопроса. Вот пример командной строки для сравнения двух сторон: FILE1="file1"; FILE2="file2"; cat <(echo -e "\nOnly in $FILE1") <(grep -Fvxf "$FILE2" "$FILE1") <(echo -e "\nOnly in $FILE2") <(grep -Fvxf "$FILE1" "$FILE2"). – pa4080 1 May 2018 в 09:24
  • 2
    Проблема с этим решением заключается в том, что он будет очень медленным, если у вас есть длинные файлы (это O (N ^ 2) по длине более длинного файла). Сначала сортировка и использование чего-то типа diff или comm будут O (N log N). – Tacroy 1 May 2018 в 18:19

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

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