[linux] 한 디렉토리에는 있지만 다른 디렉토리에는없는 파일을 찾으십시오.

한 디렉토리에 존재하지만 다른 디렉토리에는없는 파일을 찾으려고 노력 중입니다.이 명령을 사용하려고했습니다.

diff -q dir1 dir2

이 두 파일을 발견 한 위의 명령의 문제에서 dir1가 아니라에서 dir2뿐만 아니라 파일과에서 dir2가 아니라에서 dir1,

나는 파일을 찾으려고 노력하고 있지만 그 안에있는 dir1것이 아닙니다 dir2.

다음은 내 데이터가 어떻게 보이는지에 대한 작은 샘플입니다.

dir1    dir2    dir3
1.txt   1.txt   1.txt
2.txt   3.txt   3.txt
5.txt   4.txt   5.txt
6.txt   7.txt   8.txt

내 마음에 또 다른 질문은 파일을 찾을 수는 dir1있지만 단일 명령으로 dir2또는 dir3단일 명령으로 어떻게 찾을 수 있습니까?



답변

diff -r dir1 dir2 | grep dir1 | awk '{print $4}' > difference1.txt

설명:

  • diff -r dir1 dir2 dir1에만있는 파일과 dir2에만있는 파일 및 두 디렉토리에있는 파일의 변경 사항도 표시합니다 (있는 경우).

  • diff -r dir1 dir2 | grep dir1 dir1에만있는 파일을 표시합니다

  • awk 파일 이름 만 인쇄합니다.


답변

이것은 일을해야합니다 :

diff -rq dir1 dir2

옵션 설명 (diff (1) 매뉴얼 페이지를 통해 ) :

  • -r -발견 된 서브 디렉토리를 재귀 적으로 비교하십시오.
  • -q -파일이 다른지 여부 만 출력합니다.

답변

comm -23 <(ls dir1 |sort) <(ls dir2|sort)

이 명령은 dir2가 아닌 dir1에있는 파일을 제공합니다 .

정보 <( )기호, 당신은 ‘공정 대체’로 구글 수 있습니다.


답변

이 비교를 할 수있는 좋은 방법은 사용하는 것입니다 findmd5sum다음, diff.

예:

를 사용하여 find디렉토리의 모든 파일 목록은 다음 파일에 각 파일 및 파이프를위한 MD5 해시를 계산 :

find /dir1/ -type f -exec md5sum {} \; > dir1.txt

다른 디렉토리와 동일한 절차를 수행하십시오.

find /dir2/ -type f -exec md5sum {} \; > dir2.txt

그런 다음 결과 두 파일을 “diff”와 비교하십시오.

diff dir1.txt dir2.txt

이 전략은 비교할 두 디렉토리가 동일한 시스템에 있지 않고 두 디렉토리에서 파일이 동일한 지 확인해야 할 때 매우 유용합니다.

작업을 수행하는 또 다른 좋은 방법은 git을 사용하는 것입니다.

git diff --no-index dir1/ dir2/

친애하는!


답변

Meld ( http://meldmerge.org/ )는 디렉토리와 파일을 비교하는 데 큰 역할을합니다.

녹는 디렉토리 비교


답변

vim의 DirDiff 플러그인은 디렉토리를 비교하는 데 유용한 또 다른 도구입니다.

vim -c "DirDiff dir1 dir2"

디렉토리간에 다른 파일을 나열 할뿐만 아니라 vimdiff를 사용하여 다른 파일을 검사 / 수정할 수도 있습니다.


답변

모든 답글에 만족하지 못했습니다. 대부분이 매우 느리게 작동하고 큰 디렉토리에 대해 불필요하게 긴 출력을 생성하기 때문에 두 폴더를 비교하기 위해 자체 Python 스크립트를 작성했습니다.

다른 많은 솔루션과 달리 파일의 내용을 비교하지 않습니다. 또한 다른 디렉토리에없는 하위 디렉토리에 들어 가지 않습니다. 따라서 출력이 매우 간결하고 스크립트가 빠르게 작동합니다.

#!/usr/bin/env python3

import os, sys

def compare_dirs(d1: "old directory name", d2: "new directory name"):
    def print_local(a, msg):
        print('DIR ' if a[2] else 'FILE', a[1], msg)
    # ensure validity
    for d in [d1,d2]:
        if not os.path.isdir(d):
            raise ValueError("not a directory: " + d)
    # get relative path
    l1 = [(x,os.path.join(d1,x)) for x in os.listdir(d1)]
    l2 = [(x,os.path.join(d2,x)) for x in os.listdir(d2)]
    # determine type: directory or file?
    l1 = sorted([(x,y,os.path.isdir(y)) for x,y in l1])
    l2 = sorted([(x,y,os.path.isdir(y)) for x,y in l2])
    i1 = i2 = 0
    common_dirs = []
    while i1<len(l1) and i2<len(l2):
        if l1[i1][0] == l2[i2][0]:      # same name
            if l1[i1][2] == l2[i2][2]:  # same type
                if l1[i1][2]:           # remember this folder for recursion
                    common_dirs.append((l1[i1][1], l2[i2][1]))
            else:
                print_local(l1[i1],'type changed')
            i1 += 1
            i2 += 1
        elif l1[i1][0]<l2[i2][0]:
            print_local(l1[i1],'removed')
            i1 += 1
        elif l1[i1][0]>l2[i2][0]:
            print_local(l2[i2],'added')
            i2 += 1
    while i1<len(l1):
        print_local(l1[i1],'removed')
        i1 += 1
    while i2<len(l2):
        print_local(l2[i2],'added')
        i2 += 1
    # compare subfolders recursively
    for sd1,sd2 in common_dirs:
        compare_dirs(sd1, sd2)

if __name__=="__main__":
    compare_dirs(sys.argv[1], sys.argv[2])

샘플 사용법 :

user@laptop:~$ python3 compare_dirs.py dir1/ dir2/
DIR  dir1/out/flavor-domino removed
DIR  dir2/out/flavor-maxim2 added
DIR  dir1/target/vendor/flavor-domino removed
DIR  dir2/target/vendor/flavor-maxim2 added
FILE dir1/tmp/.kconfig-flavor_domino removed
FILE dir2/tmp/.kconfig-flavor_maxim2 added
DIR  dir2/tools/tools/LiveSuit_For_Linux64 added

또는 첫 번째 디렉토리의 파일 만 보려면 :

user@laptop:~$ python3 compare_dirs.py dir2/ dir1/ | grep dir1
DIR  dir1/out/flavor-domino added
DIR  dir1/target/vendor/flavor-domino added
FILE dir1/tmp/.kconfig-flavor_domino added

추신 : 잠재적 변경 사항에 대해 파일 크기와 파일 해시를 비교 해야하는 경우 https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779에 업데이트 된 스크립트를 게시했습니다.