로컬 디렉터리와 원격 디렉터리의 차이점

로컬 디렉터리와 원격 디렉터리의 차이점

내 로컬 디렉터리와 원격 디렉터리를 비교하고 싶습니다.

예: 2개의 디렉터리를 로컬 및 원격으로 처리

|-local
|  |--aaa
|  |   |--file1
|  |   |--file2
|  |
|  |--bbb
|  |   |--file1
|  |   |--file2
|  |-file1
|
|-remote
   |--ddd
       |--file1
       |--file2

rsync를 실행하려고 하면

rsync -avcn local/ remote/

나는 다음과 같은 결과를 얻습니다.

./
file1
aaa/
aaa/file1
aaa/file2
bbb/
bbb/file1
bbb/file2

모든 파일이 로컬에서도 누락된 경우에만 폴더 이름을 얻을 수 있는 방법이 있습니까?

예외 출력:

file1
aaa/
bbb/

여기서는 file1과 file2가 모두 "aaa" 및 "bbb"로 나타나므로 출력에는 폴더 이름만 표시됩니다.

답변1

다음 awk 스크립트에 명령을 파이프할 수 있습니다.

$ rsync -avcn local/ remote/ | awk 'BEGIN {prev="./"} substr($0, 0, (length(prev))) != prev {print $0; prev = $0}'
file1
aaa/
bbb/

설명하다

  • {prev="./"}: 입력 읽기를 시작하기 전에 변수를 (출력의 첫 번째 줄) prev로 설정합니다. ./이제부터 이 변수를 사용하여 이전 행의 내용을 저장하겠습니다.
  • substr($0, 0, (length(prev))): 첫 번째 문자부터 시작하여 이전 줄까지의 substr전체 줄을 추출합니다 .$00(length(prev))
  • != prev: 현재 줄의 하위 문자열을 이전 줄과 비교합니다. 기본적으로 이는 현재 줄(하위 문자열)이 이전 줄의 문자열로 시작하는지 여부를 테스트합니다. 여기서는 이스케이프해야 하기 때문에 줄의 시작 부분에 고정된 간단한 정규식을 사용하지 않습니다.
  • {print $0; prev = $0}: 현재 행인 경우하다이전 줄부터 시작하고 해당 줄이 있으면 무시합니다(즉, 인쇄하지 않음).아니요일치하면 새 디렉토리가 되므로 전체 줄이 인쇄되고 print $0새 줄은 prev변수 에 저장됩니다 prev = $0.

답변2

가장 좋은 방법은 find <dir> -maxdepth 1 -type d두 디렉터리에 대해 이를 사용한 다음 정렬된 결과를 비교하는 것입니다. Paul T의 솔루션과 유사하지만 깊이 제한이 있고 디렉터리만 고려됩니다.

$ cd <local_folder>; find . -type d -maxdepth 1 | sort > ~/local-list.txt
$ cd <remote_folder>; find . -type d -maxdepth 1 | sort > ~/remote-list.txt
$ diff -u ~/remote-list.txt ~/local-list.txt

관련 정보