실제로 파일의 데이터를 비교하지 않고 두 디렉토리 구조를 비교하는 가장 쉽고 간단한 방법은 무엇입니까? 이것은 잘 작동합니다 :
diff -qr dir1 dir2_
그러나 파일도 비교하기 때문에 실제로 느립니다. diff 또는 다른 간단한 cli 도구를위한 스위치가 있습니까?
-type d
@slartibartfast의 답변에서 옵션을 제거 하거나 내 답변을 확인해야합니다.
실제로 파일의 데이터를 비교하지 않고 두 디렉토리 구조를 비교하는 가장 쉽고 간단한 방법은 무엇입니까? 이것은 잘 작동합니다 :
diff -qr dir1 dir2_
그러나 파일도 비교하기 때문에 실제로 느립니다. diff 또는 다른 간단한 cli 도구를위한 스위치가 있습니까?
-type d
@slartibartfast의 답변에서 옵션을 제거 하거나 내 답변을 확인해야합니다.
답변:
다음 (디렉토리 1의 첫 번째 디렉토리와 디렉토리 2의 두 번째 디렉토리를 대체하는 경우)은 원하는 것을 신속하게 수행해야합니다.
find directory1 -type d -printf "%P\n" | sort > file1
find directory2 -type d -printf "%P\n" | sort | diff - file1
기본 원칙은 기본 디렉토리 N 디렉토리에 상대적인 서브 디렉토리 경로를 포함하여 모든 디렉토리를 인쇄하는 것입니다.
일부 디렉토리 이름에는 캐리지 리턴이 있지만 다른 디렉토리 이름에는 캐리지 리턴이 없으면 결과가 떨어질 수 있습니다 (와이어드 출력 생성).
diff -rq
되고 루트 디렉토리가 하나에 존재하고 계속 수행한다는 것을 보여 주기 때문에 이것은 나에게 좋지 않습니다 .
vimdiff <(cd dir1; find . | sort) <(cd dir2; find . | sort)
공통 섹션이 접혀있는 두 디렉토리 계층 구조를 나란히 표시합니다.
나는 보통 rsync
이 작업에 사용 합니다 :
rsync -nav --delete DIR1/ DIR2
아주 조심 항상 사용하려면-n
, 일명--dry-run
디렉토리를, 옵션을하거나 동기화합니다 (의 내용을 변경).
이것은 파일 수정 시간과 크기를 기준으로 파일을 비교합니다 ... 나는 그것이 정말로 원하는 것이라고 생각 합니다. 파일 내용의 차이를 무시하기 위해 더 빨리 일어나기를 원하지 는 않습니다. 동일한 이름을 가진 다른 파일을 나열하지 않으려면 --ignore-existing
옵션을 추가 하면 그렇게 할 것이라고 생각합니다.
또한 퍼팅하지 않는 것이 인식 /
의 끝에 것은 DIR1
그것이 비교하게됩니다 디렉토리를 DIR1
와 내용 의 DIR2
.
결과는 약간 장황하지만 결과적으로 어떤 파일 / 디렉토리가 다른지 보여줍니다. 존재 DIR2
하거나 존재 하지 않는 파일 / 디렉토리 DIR1
에는 단어가 앞에 붙습니다 deleting
.
어떤 경우에는 @slartibartfast의 답변이 더 적합 할 수 있지만 -type d
디렉토리가 아닌 파일 목록을 활성화하려면 옵션을 제거해야 합니다. rsync
비교할 파일 / 디렉토리 수가 많으면 더 빠릅니다.
deleting...
텍스트 를 알아 채기가 어렵지만 속도를 유지하면서 파일을 비교하는 더 좋은 방법 중 하나 일 수 있습니다. OP의 예에서와 같이 파일을 비교할 필요가 없으면 다른 답변이 더 빠르지 만 실제로이 것을 좋아합니다.
sudo -u nobody rsync -nav --delete d1 d2
'others'에 대한 플래그가 읽기를 허용하는 경우 와 같습니다 .
ls 답변과 비슷하지만 트리 를 설치 하면
tree dir1 > out1
tree dir2 > out2
diff out1 out2
diff <( tree dir1 ) <( tree dir2 )
i
트리 라인 ( tree -i dir1
, 등)을 인쇄하지 않는 플래그로 tree를 실행하는 것이 좋습니다 . 디렉토리 구조가 한 곳에서 다른 경우 일치하는 다른 파일 |
은 트리 출력에 더 많거나 적은 기호를 가질 수 있으며 diff는 파일 경로가 동일한 경우에도 해당 줄을 잡습니다.
나는이 문제에 대한 해결책을 찾고있었습니다. 내가 가장 좋아하는 솔루션은 다음과 같습니다.
comm <(ls DIR1) <(ls DIR2)
여기에는 3 개의 열이 있습니다. 1-DIR1의 파일 만, 2-DIR2의 파일 만, 3-DIR3의 파일 자세한 내용은이 블로그 게시물을 참조하십시오 .
DIR3
지정되어 있습니까? 내가 보는 모든이다 DIR1
과 DIR2
.
DIR1
의 열 1 만 모든 파일 DIR2
에 열이 , 모든 파일을 모두 공유 에 열 3 . 그것은 유용하지만, 3 열을 어떻게 제거 하고 차이점 만 남길 수 있는지 알고 있습니까? 정렬 할 파일 이 많이 있으며 대부분 동일합니다. 나는 같은 것을 볼 필요가 없습니다.
comm <(ls DIR1) <(ls DIR2)
재귀 적으로 작동하지 않는 것으로 나타났습니다 . 나는 그것을 사용했다 comm <(ls -R1 DIR1) <(ls -R1 DIR2)
. ls -R
디렉토리를 재귀 적으로 탐색하고 ls -1
( L이 아닌 하나임 ) 한 줄에 하나의 파일 이름 만 인쇄합니다. ls
comm -3
(참조 man comm
).
이것은 최적의 솔루션입니다
diff --brief -r dir1 dir2
--brief 스위치는 차이점에 대한 세부 정보가 아니라 파일이 다른지 여부 만보고합니다.
-q
질문에 있으며의 별칭입니다 --brief
. 이 답변은 새로운 정보를 제공하지 않습니다.
But it's really slow because it's comparing files too.
나는 rsync 만 userfull이라고 생각합니다. 왜?
diff는 파일과 디렉토리를 유지하는 구조에만 유용합니다. Diff는 심볼릭 링크를 사용할 때 적절한 종료 코드를 제공하지 않습니다. 이 경우 diff는 src와 dst가 동일한 경우에도 2 개의 종료 코드를 반환 할 수 있습니다 (시간, 크기, 이름, 타임 스탬프, 포인팅 소프트 링크 등).
dir, 파일 시스템은 src와 dst의 디렉토리 내용이 동일하더라도 파일 순서를 보장하지 않습니다. 어쩌면 ls 출력을 정렬하여 필터링해야 할 수도 있습니다. 그러나 pure ls는 노드 이름 만 표시합니다.
노드 유형에 대해 diff, cmp, test -X를 포함한 스크립트가 유용 할 수 있지만 많은 test / cmp 실행으로 인한 과부하에 대해 기억하십시오. 스크립트 속도가 매우 느립니다.
평소와 같이 "dirs is / isn 같지 않음"이라는 간단한 정보를 얻으려면 -n (dry) 옵션과 함께 rsync를 사용해야합니다. 다른 것을 찾으려면 diff 명령을 사용하십시오.