Я пытаюсь найти файлы, существующие в одном каталоге, но не в другом, я пытался использовать эту команду:
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
в одной команде?
grep
хотел^dir1
убедиться, что неdir1
появлюсь позже на этом пути.$4
в качестве примера. На самом деле, на моем настоящем Ubuntu,diff
отвечает на итальянском.$4
подходит для ответов на итальянском и английском языках, но я не уверен в других языках ...Это должно сделать работу:
Опции объяснены (через справочную страницу diff (1) ):
-r
- Рекурсивно сравнивать любые найденные подкаталоги.-q
- Выводить только файлы отличаются.источник
diff -rq dir1 dir2 | grep 'Only in dir1/'
-q
опции: на страницах руководства написано только «Вывести только, если файлы различаются», а не то, как он проверяет, отличаются ли они. Я просмотрел исходный код и обнаружил, что он проверяет только размеры файлов, чтобы определить различия, а не фактическое содержимое.-q
опции, я не могу воспроизвести, что она только проверяет размер файла. Использование GNU Diffutils 3.7 для сравнения двух файлов с одинаковым размером, но разным содержимым сdiff -q file1 file2
выходными даннымиFiles file1 and file2 differ
.Эта команда выдаст вам файлы, которые находятся в dir1, а не в dir2.
О
<( )
знаке, вы можете погуглить его как «процесс замены».источник
(ls -R dir1|sort)
(ls -R dir|sort)
.vimdiff <(ls dir1 |sort) <(ls dir2|sort)
Хороший способ сделать это сравнение - использовать
find
сmd5sum
, а затемdiff
.Пример:
Используйте
find
для вывода списка всех файлов в каталоге, затем вычислите хэш md5 для каждого файла и передайте его в файл:Проделайте ту же процедуру с другим каталогом:
Затем сравните результат двух файлов с «diff»:
Эта стратегия очень полезна, когда сравниваемые два каталога не находятся на одном компьютере, и вам необходимо убедиться, что файлы в обоих каталогах совпадают.
Еще один хороший способ сделать работу - использовать git
С уважением!
источник
Мелд ( http://meldmerge.org/ ) отлично справляется со сравнением каталогов и файлов внутри.
источник
Плагин Vim DirDiff - еще один очень полезный инструмент для сравнения каталогов.
Он не только перечисляет, какие файлы отличаются между каталогами, но также позволяет вам проверять / изменять с помощью vimdiff файлы, которые отличаются.
источник
Неудовлетворенный всеми ответами, так как большинство из них работают очень медленно и выдают излишне длинный вывод для больших каталогов, я написал свой собственный скрипт Python для сравнения двух папок.
В отличие от многих других решений, он не сравнивает содержимое файлов. Также это не входит в подкаталоги, которые отсутствуют в другом каталоге. Таким образом, вывод довольно лаконичен, и скрипт работает быстро.
Пример использования:
Или, если вы хотите видеть только файлы из первого каталога:
PS Если вам нужно сравнить размеры файлов и хэши файлов на предмет возможных изменений, я опубликовал обновленный скрипт здесь: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
источник
Другой (может быть, быстрее для больших каталогов) подход:
Команда
sed
удаляет первый компонент каталога благодаря посту Эрика )источник
find
следовательно, комментарий, а не отдельный ответ): онcd dir2; find . -exec [ -e ../dir1/{} ] \; -o -print 2>/dev/null
будет печатать файлы, присутствующие в dir2, но не присутствующие в dir1.Это немного поздно, но может кому-то помочь. Не уверен, что diff или rsync выкладывают только имена файлов в таком формате. Спасибо plhn за то, что дал мне хорошее решение, о котором я рассказал ниже.
Если вам нужны только имена файлов, поэтому легко скопировать нужные файлы в чистом формате, вы можете использовать команду find.
Это предполагает, что и dir1, и dir2 находятся в одной родительской папке. sed просто удаляет родительскую папку, чтобы вы могли сравнить яблоки с яблоками. Последний sed просто возвращает имя dir1.
Если вы просто хотите файлы:
Аналогично для каталогов:
источник
cd
до того , какfind
вместо того , чтобы использоватьsed
, например:comm -23 <(cd dir1 || exit; find -type f | sort) <(cd dir2 || exit; find -type f | sort)
. (exit
S здесь, чтобы предотвратитьfind
использование текущего каталога, долженcd
comm
с поддержкой-z
(поставляется с git.savannah.gnu.org/cgit/coreutils.git/commit/… ), которую вы можете сделатьcomm -23 -z <(cd dir1 && find -type f -print0 | sort -z) <(cd dir2 && find -type f -print0 | sort -z)
, (Тем временем я также понял, чтоexit
s можно заменить.)В принятом ответе также будут перечислены файлы, которые существуют в обоих каталогах, но имеют разное содержимое. Чтобы вывести список ТОЛЬКО файлов, которые существуют в dir1, вы можете использовать:
Объяснение:
источник
Этот ответ оптимизирует одно из предложений @ Adail-Junior, добавив
-D
параметр, который полезен, когда ни один из сравниваемых каталогов не является репозиторием git:Если вы используете,
-D
то вы не увидите сравнения с/dev/null
:text Binary files a/whatever and /dev/null differ
источник
Упрощенный способ сравнения двух каталогов с помощью команды DIFF
открыть файл filename.dat после завершения запуска
и вы увидите: Только в filename.1: filename.2 Только в: directory_name: name_of_file1 Только в: directory_Name: name_of_file2
источник
Это скрипт bash для печати команд для синхронизации двух каталогов
источник
GNU
grep
может инвертировать поиск с помощью опции-v
. Это делаетgrep
сообщение строк, которые не совпадают. Таким образом, вы можете удалить файлыdir2
из списка файлов вdir1
.Опции
-F -x
говорятgrep
выполнить поиск строки по всей строке.источник