Найдите файлы, существующие в одном каталоге, но отсутствующие в другом

Я'пытаюсь найти файлы, существующие в одном каталоге, но не в другом, я пытался использовать эту команду:

diff -q dir1 dir2

Проблема в том, что команда находит как файлы в dir1, но не в dir2, так и файлы в dir2, но не в dir1,

Я пытаюсь найти файлы только в dir1, но не в dir2.

Вот небольшой пример того, как выглядят мои данные

dir1    dir2    dir3
1.txt   1.txt   1.txt
2.txt   3.txt   3.txt
5.txt   4.txt   5.txt
6.txt   7.txt   8.txt

Еще один вопрос: как я могу найти файлы в dir1, но не в dir2 или dir3 в одной команде?

Решение
diff -r dir1 dir2 | grep dir1 | awk '{print $4}' > difference1.txt

Пояснение:

  • diff -r dir1 dir2 показывает, какие файлы находятся только в каталоге dir1, а какие только в каталоге dir2, а также изменения файлов, присутствующих в обоих каталогах, если таковые имеются.

  • diff -r dir1 dir2 | grep dir1 показывает, какие файлы находятся только в каталоге dir1

  • awk для печати только имени файла.

Комментарии (2)

Это должно сделать работу:

diff -rq dir1 dir2

Параметры объяснил (через дифф(1) страницу):

  • - рекурсивно сравниваем найденных подкаталогов.
  • - вывод только о том, что файлы отличаются.
Комментарии (4)

comm -23 
Комментарии (4)

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

Пример:

Использовать найти в список все файлы в каталоге, затем вычислить MD5-хэш для каждого файла и вставьте его в файл:

find /dir1/ -type f -exec md5sum {} \; > dir1.txt

Делать ту же процедуру на другой каталог:

find /dir2/ -type f -exec md5sum {} \; > dir2.txt

Затем сравнить результаты двух файлов с "разница" в:

diff dir1.txt dir2.txt

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

Еще один хороший способ, чтобы выполнить задание использует мерзавец

git diff --no-index dir1/ dir2/

С наилучшими пожеланиями!

Комментарии (1)

Мелдинг (http://meldmerge.org/) делает большую работу по сравнения каталогов и файлов внутри.

Комментарии (4)

Плагин vim'a DirDiff - еще один очень полезный инструмент для сравнения каталогов.

vim -c "DirDiff dir1 dir2"

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

Комментарии (0)

Недовольны все ответы, так как большинство из них очень медленно работать и производить длинные выходные неоправданно большие каталоги, я написал свой скрипт на Python, чтобы сравнить две папки.

В отличие от многих других решений, он не'т сравнить содержимое файлов. Также он не'т пойти внутри подкаталогов, которые отсутствуют в другой каталог. Поэтому выход достаточно лаконичной и скрипт работает быстро.


#!/usr/bin/env python3

import os, sys

def compare_dirs(d1: "old directory name", d2: "new directory name"):
    def print_local(a, msg):
        print('DIR ' if a[2] else 'FILE', a[1], msg)
    # ensure validity
    for d in [d1,d2]:
        if not os.path.isdir(d):
            raise ValueError("not a directory: " + d)
    # get relative path
    l1 = [(x,os.path.join(d1,x)) for x in os.listdir(d1)]
    l2 = [(x,os.path.join(d2,x)) for x in os.listdir(d2)]
    # determine type: directory or file?
    l1 = sorted([(x,y,os.path.isdir(y)) for x,y in l1])
    l2 = sorted([(x,y,os.path.isdir(y)) for x,y in l2])
    i1 = i2 = 0
    common_dirs = []
    while i1
Комментарии (1)

Другой (может быть быстрее для больших каталогах) подход:

$ find dir1 | sed 's,^[^/]*/,,' | sort > dir1.txt && find dir2 | sed 's,^[^/]*/,,' | sort > dir2.txt
$ diff dir1.txt dir2.txt

В СЭД команда удаляет первый компонент каталога благодаря посту Эрика)

Комментарии (1)

Этот ответ оптимизирует одно из предложений от @Adail-младший, добавив опцию , что полезно, когда ни один из каталогов сравниваются git-репозиториев:

git diff -D --no-index dir1/ dir2/

Если вы используете , то вы выиграли'т вижу сравнения с /dev/нуль: текст Бинарные файлы/что и /dev/нуль отличаться

Комментарии (1)

Это немного поздно, но может кому-то помочь. Не уверен, если дифф или rsync выплюнуть просто имена в голой формате. Благодаря plhn для дачи, что хорошее решение, которое я расширены ниже.

Если вы хотите просто имена файлов, так что's легко, просто скопируйте нужные вам файлы в чистом формате, вы можете использовать команду find.


comm -23 
Комментарии (2)

Принято отвечать также список файлов, которые есть в обоих каталогах, но имеют различное содержание. В списке только файлы, которые существуют в dir1 вы можете использовать:

diff -r dir1 dir2 | grep 'Only in' | grep dir1 | awk '{print $4}' > difference1.txt

Объяснение:

  • дифф -Р директория dir2 dir1 и сравнить
  • команда grep 'только в': вам строки, которые содержат 'только в'
  • грэп директорию dir1 : вам строки, содержащие реж
Комментарии (0)

kdiff3 имеет приятный интерфейс копирования файлов и каталогов.

Он работает на Windows, Linux, и macOS.

Вы можете установить ее несколькими способами:

Комментарии (0)

Это bash-скрипт на команды печати для синхронизации двух каталогов

dir1=/tmp/path_to_dir1
dir2=/tmp/path_to_dir2
diff -rq $dir1 $dir2 | sed -e "s|Only in $dir2\(.*\): \(.*\)|cp -r $dir2\1/\2 $dir1\1|" |  sed -e "s|Only in $dir1\(.*\): \(.*\)|cp -r $dir1\1/\2 $dir2\1|" 
Комментарии (0)

Упрощенный способ сравнить 2 папки, используя команду diff

дифф именем.1 именем.2 > именем.дат >>введите

открыть именем.DAT после завершения выполнения

и вы увидите: Только в имени файла.1: имя.2 Только в параметра directory_name: name_of_file1 Только в параметра directory_name: name_of_file2

Комментарии (1)

Грэп ГНУ может обратный поиск с опцией . Это делает команда grep отчетность строк, которые не совпадают. При этом вы можете удалить файлы в директории dir2из списка файлов в директорию dir1.


grep -v -F -x -f 
Комментарии (0)