다운로드가 속이 아닌지 확인


3

WebDav 서버에서 파일 디렉토리를 (재귀 적으로) 위치로 다운로드하고 싶습니다. 파일이 이미 존재하는 경우 (어딘가에) 다시 다운로드되지 않습니다. 그러나 폴더 구조는 동일하지 않습니다.

그렇게하는 쉬운 방법이 있습니까? 나는 fdupes를 살펴 보았지만 dupe를 감지하고 삭제하기위한 것입니다. 파일이 매우 커서 오버 헤드가 너무 큽니다.

대상 파일 시스템은 중복 제거를 지원하지 않습니다. 나는 알고있다 cp -n(퓨즈 마운트 지점에서)는 기존 파일을 덮어 쓰지 것이지만, 폴더 구조는 동일하지 않습니다. 그래서 나는 붙어 있습니다.

답변:


3

WebDAV에 사용 가능한 Linux 클라이언트를 살펴보면 내가 선호하는 방법은 다음과 같습니다.

  1. GVFS 또는 WebDAV 파일 시스템 모듈 중 하나 (davfs2 또는 fusedav)를 사용하여 원격 WebDAV 서버의 파일을 로컬 파일 시스템 경로에 "매핑"하십시오.

  2. 내장 된 cp 명령을 -n옵션 과 함께 사용하여 대상에서 파일을 "클러버하지 않도록"지시합니다. dashUbuntu 와 같은 특정 셸 은 기본적으로 builtin버전을 실행 cp하므로이 내장 -n옵션 이 옵션을 지원하지 않을 수 있습니다 . 최상의 결과를 얻으려면 또는 특정 시스템의 바이너리 위치에 따라 또는 실행하여 GNU Coreutils 버전을 cp실행 해야합니다./bin/cp/usr/bin/cp

편집 : 나는 당신의 원래 질문을 잘못 읽었습니다.

나는 당신이 file1.txtWebDAV 서버에서 두 개의 다른 경로에 파일 이 존재하고 그 두 파일 의 내용 이 정확히 같은 상황이라고 생각합니다. 파일 사본이 이미 있으므로 대역폭을 낭비하기 때문에 파일의 두 번째 또는 세 번째 사본을 다운로드하고 싶지 않습니까?

글쎄, 클라이언트 쪽에서 , 이것은 매우 어려울 것입니다. 이유는 다음과 같습니다.

당신은 볼 필요 는 비교하고 어떤 파일이 고유한지 확인하고, 요구 사항 / 비용은 그 비교를 할 수 있습니다.

나는 당신이 비교하는 것이 WebDAV 폴더 구조의 루트에 상대적인 경로 라고 잘못 생각했습니다 . 경로 평등 비교를 만드는 비용은 매우 쉽습니다. 두 개의 경로 문자열 (예 :)을 보고 문자열이 일치하는지 확인하면됩니다. 그렇다면 중복 된 것입니다. 그렇지 않다면 그렇지 않습니다./dir1/dir2/file1.txt

비교할 수있는 또 다른 것은 경로를 무시하고 파일 이름 입니다. : 그래서, 예를 들어,이 두 파일이 중복이라고 생각 하고 ? 당신이하는 경우 글쎄, 에 기초를 비교하는 이름 , 다음이 중복으로 간주 될 것이다. 그러나 사용 사례에 적합한 종류의 테스트를 수행하기 위해 원하는대로 복제에 대한 다양한 테스트를 혼합하고 일치시킬 수 있습니다./dir1/dir2/file1.txt/dir3/dir4/file1.txt

비교하기에 유용하지 않은 다른 속성으로는 파일 크기 , 속성 ( 메타 데이터 라고도 함 ), 파일 확장명 등이 있습니다. 대부분의 경우 복제 판단력 측면에서는 그다지 중요하지 않습니다. 다른 파일과 동일한 속성을 갖지만 완전히 다른 내용을 가진 파일을 구성하는 것은 쉽지만 대부분의 사람들은 내용이 다른 경우 두 파일이 중복되는 것으로 간주하지 않습니다.

내 의견으로는, 당신이 비교할 수있는 가장 중요한 것은 파일 내용 입니다. 불행히도 WebDAV 클라이언트의 관점에서 볼 때 파일을 이미 다운로드 할 때까지 파일 내용을 알 수있는 방법이 없습니다. 클라이언트와 관련하여 파일 전송 중 또는 후에 파일 내용이 변경 될 수 있습니다.이 경우 파일을 다시 다운로드하면 중복 비교 결과가 변경됩니다.

파일 내용을 비교하는 기본 방법에는 byte for bytehashing이 있습니다. 바이트 바이트는 중복을 확인하는 가장 "보증 된"방법이지만 전체 파일 을 비교해야한다는 제한이 있습니다 . 이로 인해 많은 양의 데이터에 대해 속도가 느려집니다. 또한 중복 감지의 기본 알고리즘 복잡도는임을 고려하십시오. 즉, 중복 O(n^2)여부를 판별하려면 각 파일의 내용을 서로 다른 파일의 내용과 비교해야합니다. 암호화 해시를 사용하여 파일을 비교하면 비교하거나 전송할 데이터의 양을 크게 줄일 수 있지만 단점은 두 파일이 실제로 다를 수있는 무한한 가능성을 초래한다는 것입니다 해시 충돌이라고하는 동일한 해시가 있습니다.

그러나 클라이언트 관점에서, 다음 중 하나가 아니면 파일 내용이 무엇인지 또는 해시를 알 수 없습니다.

  • 서버에서 파일을 다운로드하십시오. 또는
  • 서버가 로컬로 해시 값을 계산하도록 확인한 다음 해시를 다운로드하십시오.

전자의 경우 파일을 다운로드하지 않기 위해 파일이 중복인지 확인하기 위해 파일을 다운로드하므로 분명히 할 수는 없습니다 . 비교를 수행 하지 않으려는 대역폭을 낭비하고 있습니다. !

후자의 경우, 당신은 무언가에있을 수 있습니다. 매우 큰 파일의 SHA1 해시는 단지 몇 바이트이며 큰 파일 크기의 작은 부분을 나타냅니다. 모든 파일 O(n^2)해시 를 다운로드하고 다운로드 할 파일을 결정하기 위해 해시 를 비교 하는 것이 상당히 실용적 입니다. 그러나 이러한 비교를 수행하는 동안 서버에서 파일 데이터가 변경되는 경우 여전히 경쟁 조건 문제가 발생하므로 중요한 경우 동기화를 고려해야합니다.

결론 :

  • 경우 당신은 WebDAV 서버를 완벽하게 소프트웨어 제어를 가지고 구성을 변경할 수 없습니다하지 않습니다, 당신은 당신이 이미 동일한 사본이 있는지 여부를 결정 꽤 많이 운 (TM)의 밖으로 파일 내용을 여러에 저장됩니다 서버에서 파일을 제외하고 서버 관리자가 이미 해시 값에 의존 할 수 있는지 당신에게 성공을 어느 정도 허용 할 수 있습니다 서버의 모든 파일에 대한 해시 파일이 어떤 종류의 가능을합니다.
  • 경우 당신이 할 수 는 WebDAV 서버를 완벽하게 소프트웨어 제어를 가지고있는 의 구성을 변경하려면 스크립트 나 프로그램을 작성 할 수 있습니다 (또는 이미 하나를 사용) 예와 같은 확장과 해시 파일을 만들 .sha1sum에 WebDAV 서버가 호스트하는 모든 파일과 동일한 디렉토리. 이렇게하면 파일 크기가 몇 킬로바이트 이상이라고 가정하면 해시 만 다운로드하여 파일 크기와 비교할 때 상대적으로 적당한 대역폭 비용으로 비교할 수 있습니다.

나는 파일에 존재하지 않는 것을 의미하는 어떤 다른 곳에서는 그 위치에서 하위 폴더, 또는
wishi

1
오. 파일이 /dir1/dir2/file1.txt 및 /dir3/dir4/file1.txt 경로에 존재하고 두 파일이 서로의 사본입니까? 이것은 문제가 될 것입니다. : S
allquixotic

그 답변에 감사드립니다. 해시 섬과 목록을 사용하는 접근 방식은 갈 길입니다. 파이썬으로. 나는 awk / sed / cp / md5sum 마술과 함께 잘 알려진 즉시 사용 가능한 속임수가 있는지 알지 못했습니다 :) 때로는 있습니다. 그리고 나는 보통 마지막 사람입니다.
wishi

1
이봐, 일반적으로 유용한 파이썬으로 무언가를 개발한다면, github 등에 코드를 게시하고 배운 것을 제공하는 내 대답 (및 / 또는 질문)을 편집해야합니다. :) 같은 문제가 있습니다.
allquixotic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.