![로컬 디렉터리와 원격 디렉터리의 차이점](https://linux55.com/image/128121/%EB%A1%9C%EC%BB%AC%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%99%80%20%EC%9B%90%EA%B2%A9%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EC%A0%90.png)
내 로컬 디렉터리와 원격 디렉터리를 비교하고 싶습니다.
예: 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
전체 줄을 추출합니다 .$0
0
(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