2012-06-18 2 views
9

Используя Gnome в Linux Mint 12, я скопировал папку из 9,7 ГБ (содержащую сложное дерево вложенных папок) с одного флэш-диска NTFS на другой флэш-накопитель NTFS. Согласно Gnome, файл подсчитывает совпадение, но согласно du (и другим программам) количество байтов не совпадает. (У меня была такая же проблема с копированием папок в других дистрибутивах Linux и Windows XP.)Сравните 2 папки и найдите файлы с разным количеством байтов

Я только хочу знать, какие файлы не имеют совпадающих байтов. (Я не хочу сравнивать содержимое каждого файла, потому что это займет слишком много времени.) Какой самый лучший, самый простой и быстрый способ найти файлы с несоответствующим байтом?

+0

Однострочник найденных решений для соответствующего Unix StackExchange вопроса: http://unix.stackexchange.com/q/62140 – tanius

ответ

3

Предполагая, что вам нужно сравнить dir1 и реж 2, здесь команды консоли:

cd dir1 
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir1.txt 
cd dir2 
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir2.txt 
diff ~/dir1.txt ~/dir2.txt 

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

6

Вы проверили, имеют ли оба раздела одинаковые атрибуты? (размер блока, размер, зарезервированное пространство для удалений или плохие блоки и т. д.)

Для вашего конкретного случая я бы порекомендовал rsync с опцией -n (или --dry-run). Он расскажет вам, какие файлы разные. То есть:

$ rsync -I -n /source/ /target/ 

Опция -I это игнорировать раз. Вы можете использовать ту же команду, чтобы сделать обе каталоги эквивалентными (отметка времени, разрешения и т. Д.).

Проверьте руководство по Rsync или попробуйте опцию --help, чтобы получить больше возможностей и примеры того, как использовать его. Это очень мощный.

10

Я бы адаптировал ответ на @ user1464130, так как у него возникли проблемы с обработкой пробелов в именах файлов.

cd dir1 
find . -type f -printf "%p %s\n" | sort > ~/dir1.txt 
cd dir2 
find . -type f -printf "%p %s\n" | sort > ~/dir2.txt 
diff ~/dir1.txt ~/dir2.txt 

Если вы хотите запустить команду для каждого файла и использовать результат в отчете, вы можете использовать конструкцию while Bash. В этом примере для вычисления контрольной суммы для каждого файла используется md5sum.

find . -maxdepth 1 -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done 

Каждый $() выполняется отдельно и позволяет вычислять контрольную сумму для каждого файла. Использование tr сжимает все последовательные пробелы в одно пространство, а cut извлекает слово в n-й позиции, здесь, в первой позиции. Если мы этого не сделаем, мы получим имя файла два раза, потому что md5sum вернет его на стандартный вывод.

Ниже приведен пример без использования сравнения (нет diff). Обратите внимание, что я использовал тире -, чтобы подчеркнуть три данных, которые мы выводим о каждом файле, но это может быть проблемой, если вы хотите передать ее другой программе.

$ find . -maxdepth 1 -name "*.c" -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done 
./thread.c - 5f2b7b12c7cd12fcb9e9796078e5d15b - 584 
./utils.c - d61bc1dbc72768e622a04f03e3b8f7a2 - 3413 
+0

Как трудно было бы отрегулировать этот сценарий для печати контрольной суммы для каждого файла в списке ? – mydoghasworms

+0

I'v отредактировал мой ответ, чтобы предоставить решение. Я просто добавил контрольную сумму, не делая diff. Вы хотите различить контрольную сумму?Если это так, то вам не нужно количество байтов, и оно немного отличается от вопроса OP. Более того, контрольная сумма лучше, если мы хотим быть уверенными, что оба файла одинаковы или нет. Мы могли бы даже добавить время изменения файла – lkuty

+0

Gnarly. Большое спасибо. – mydoghasworms

Смежные вопросы