Я хочу (рекурсивно) загрузить каталог файлов в определенное место с WebDav-сервера. Если файл уже присутствует (где-то там), он не будет загружен снова. Однако структура папок не та же самая.
Есть ли простой способ сделать это? Я посмотрел fdupes, но он только для обнаружения и удаления дубликатов. Файлы очень большие, и накладные расходы будут слишком велики.
Целевая файловая система не поддерживает дедупликацию. Я знаю cp -n
(из точки монтирования FUSE) не перезапишет существующие файлы, но структура папок не та же самая. Так что я как бы застрял.
решение1
От взгляда надоступные клиенты Linux для WebDAV, я бы предпочел следующий метод:
Используйте GVFS или один из модулей файловой системы WebDAV (davfs2 или fusedav) для «сопоставления» файлов удаленного сервера WebDAV с путем локальной файловой системы.
Используйте встроенную функциюсркоманду с
-n
опцией, указывающей на то, что файлы в месте назначения "не затирать". Обратите внимание, что некоторые оболочки, напримерdash
Ubuntu, по умолчанию будут выполнятьbuiltin
версию , и эта встроенная функция может не поддерживать эту опцию. Для достижения наилучших результатов убедитесь, что вы выполняете версию GNU Coreutils, запустив или (в зависимости от того, где в вашей конкретной системе находится двоичный файл).cp
-n
cp
/bin/cp
/usr/bin/cp
EDIT: Я неправильно понял ваш изначальный вопрос.
Я думаю, вы говорите о том, что у вас ситуация, когда файл file1.txt
существует по двум разным путям на сервере WebDAV, исодержаниеиз этих двух файлов совершенно одинаковы. И поскольку у вас уже есть одна копия файла, вы не хотите загружать вторую или третью копию файла, потому что это тратит пропускную способность?
Хорошо,со стороны клиента, это было бы очень трудно сделать. Вот почему.
Вам нужно посмотреть начто вы сравниваетечтобы определить, является ли файл уникальным, итребования/затратычтобы провести такое сравнение.
япредполагается(ошибочно) что то, что вы сравнивали, этопутьотносительно корня структуры папок WebDAV. Стоимость сравнения эквивалентности путей очень проста: вы просто смотрите на две строки путей, например /dir1/dir2/file1.txt
, и смотрите, совпадают ли строки. Если совпадают, то это дубликат. Если нет, то нет.
Еще одна вещь, которую вы можете сравнить, это файлимя, игнорируяпуть. Так, например, вы считаете ли вы эти два файла дубликатами: /dir1/dir2/file1.txt
и /dir3/dir4/file1.txt
? Ну, если вытолькосравнение на основеимя, то они будут считаться дубликатами. Однако мы можем смешивать и сопоставлять различные тесты на дублирование по своему усмотрению, чтобы создать правильный тип теста для нашего варианта использования.
Другие, менее полезные свойства для сравнения включают:размер файла,атрибуты(также известен какметаданные), расширение файла и т. д. Эти вещи не дают вам особых оснований для оценки дубликатов, поскольку в большинстве случаев легко создать файл, который имеет те же свойства, что и другой файл, но совершенно другое содержимое, и большинство людей не посчитают два файла дубликатами, если их содержимое отличается.
По моему мнению, самое важное, что можно сравнить — это файлсодержание. К сожалению, с точки зрения клиента WebDAV, у вас нет возможности узнать содержимое файла, пока вы его не загрузите. А с точки зрения клиента содержимое файла может измениться во время или после передачи файла, и в этом случае результаты сравнения дубликатов изменятся, если вы повторно загрузите файл.
Существует два основных способа сравнения содержимого файлов:байт за байтом, ихеширование. Байт за байтом — наиболее «гарантированный» способ проверки на наличие дубликатов, но он страдает от ограничения, заключающегося в том, что вам нужно сравниватьвесь файл, что чрезвычайно медленно для большого объема данных. Также учтите, что базовая алгоритмическая сложность обнаружения дубликатов составляет O(n^2)
, что означает, что вам придется сравнивать содержимое каждого файла с содержимым каждого другого файла, чтобы определить, является ли он дубликатом. Использование криптографического хеша для сравнения файлов может значительно сократить объем данных, которые необходимо сравнить или передать, но недостатком является то, что вы вводите бесконечно малую вероятность того, что два файла могут быть на самом деледругойно имеют одинаковый хэш — это называется коллизией хешей.
Но опять же, изклиентперспектива, это невозможно знатьчтосодержимое файла или даже его хэш, если только вы не:
- Загрузите файл с сервера; или
- Убедите сервер вычислить для вас локальное значение хэша, а затем загрузите хэш.
В первом случае вы скачиваете файл, чтобы определить, является ли он дубликатом, и избежать скачивания файла, поэтому вы, очевидно, не можете этого сделать — вы тратите пропускную способность, которой пытаетесь избежать.просто для того, чтобы выполнить сравнения!
В последнем случае вы, возможно, на верном пути. SHA1-хэш очень большого файла занимает всего пару байт и представляет собой крошечную часть размера большого файла. Было бы довольно практично загрузить хэши всех файлов и сделать O(n^2)
сравнениехэшичтобы определить, какой файл загрузить. Однако вы все равно столкнетесь с проблемами состояния гонки, если данные файла изменятся на сервере, пока вы делаете эти сравнения, поэтому вам нужно убедиться, что вы учитываете синхронизацию, если это важно для вас.
Итак, вывод:
- ЕСЛИу вас нет полного программного контроля над сервером WebDAV и вы не можете вносить изменения в его конфигурацию, вам вряд ли повезет (tm) при определении того, есть ли у вас уже копия того же самогосодержимое файлакоторые хранятся в нескольких файлах на сервере,пока неАдминистратор сервера уже предоставляет некие хэш-файлы для каждого файла на сервере, что может обеспечить вам некоторую степень успеха, если вы можете положиться на хэш-значения.
- ЕСЛИтыделатьимеют полный программный контроль над сервером WebDAV испособныйчтобы изменить его конфигурацию, вы можете написать скрипт или программу (или использовать уже имеющуюся) для создания хэш-файла с расширением, например,
.sha1sum
в том же каталоге, что и каждый файл, размещенный на сервере WebDAV. Это может позволить вам загружать только хэши и сравнивать их, при относительно скромной стоимости полосы пропускания по сравнению с размером файлов, предполагая, что ваши файлы имеют размер более пары килобайт.