digiwhite — Сравнение двух директорий и удаление из второй файлов-дубликатов
Чего-то читая форумы, увидел, что некоторые ищут как удалить файлы-дубликаты (чаще это фотографии или музыка) из одного из двух каталогов. Поэтому, решил набросать скриптик на bash`е, который позволяет это делать.
Скрипт не очень большой и достаточно простой. При желании, его можно расширить и усложнить, добавив функциональности.
Собственно далее идет код:
Суть работы скрипта достаточно проста и прозрачна.
В начале, мы проверяем количество параметров, что за параметры нам были переданы и совпало ли их количество. Далее проверяем, существуют ли указанные директории. Если директории существуют, то создаем два списка (по одному для каждой директории), содержащих пары {хеш значение файла(дайджест),имя файла}. Списки эти получаются в два этапа:
Затем сравниваем оба списка поэлементно - каждый элемента списка файлов первой директории с каждым элементом списка файлов второй директории. Если элементы совпали, то из второй директории удаляем файл-дубликат. Когда сравнение списков завершается, то удаляем временные файлы, содержащие сами списки.
Как использовать:
Если в директории dir2 будут найдены файлы, совпадающие по содержимому с файлами в dir1, то они будут удалены из dir2.
Минусы: по идее, сначала надо проверить на дубликаты каждую директорию саму с собой (чтобы исключить наличие дублирующихся файлов в директории) и затем уже сравнивать друг с другом. Есть вероятность, что md5sum выдаст на разных файлах одинаковое хеш-значение (однако вероятность этого очень, очень мала, но для тех кто сомневается может заменить md5sum на sha384sum или sha512sum для большей уверенности).
Плюсы: все равно какие файлы сравнивать. Это не имеет значения.
Скрипт не очень большой и достаточно простой. При желании, его можно расширить и усложнить, добавив функциональности.
Собственно далее идет код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
|
Суть работы скрипта достаточно проста и прозрачна.
В начале, мы проверяем количество параметров, что за параметры нам были переданы и совпало ли их количество. Далее проверяем, существуют ли указанные директории. Если директории существуют, то создаем два списка (по одному для каждой директории), содержащих пары {хеш значение файла(дайджест),имя файла}. Списки эти получаются в два этапа:
- создание отсортированного списка файлов (можно и не сортировать конечно);
- прохождение по списку файлов из пункт 1 и подсчет для каждого файла хеш-значения с помощью md5sum (можно так же использовать sha1sum, sha224sum, sha256sum и т.п.), и запись пары {хеш-значение, имя файла} в другой список.
Затем сравниваем оба списка поэлементно - каждый элемента списка файлов первой директории с каждым элементом списка файлов второй директории. Если элементы совпали, то из второй директории удаляем файл-дубликат. Когда сравнение списков завершается, то удаляем временные файлы, содержащие сами списки.
Как использовать:
./имя_скрипта -f ~/dir1 -s ~/dir2
Если в директории dir2 будут найдены файлы, совпадающие по содержимому с файлами в dir1, то они будут удалены из dir2.
Минусы: по идее, сначала надо проверить на дубликаты каждую директорию саму с собой (чтобы исключить наличие дублирующихся файлов в директории) и затем уже сравнивать друг с другом. Есть вероятность, что md5sum выдаст на разных файлах одинаковое хеш-значение (однако вероятность этого очень, очень мала, но для тех кто сомневается может заменить md5sum на sha384sum или sha512sum для большей уверенности).
Плюсы: все равно какие файлы сравнивать. Это не имеет значения.