programing

한 디렉터리에 있지만 다른 디렉터리에 없는 파일 찾기

telebox 2023. 4. 22. 09:16
반응형

한 디렉터리에 있지만 다른 디렉터리에 없는 파일 찾기

한 디렉터리에 있는 파일을 찾으려 하지만 다른 디렉터리에 있는 파일을 찾으려 하지 않습니다. 다음 명령을 사용하려고 했습니다.

diff -q dir1 dir2

: 두 파일을 수 .dir1 에는 dir2.dir2 에는 dir1,

.dir1 에는 dir2disclossible.

다음은 데이터 표시의 작은 예입니다.

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) man 페이지 사용):

  • -r으로 비교합니다 비교합니다.
  • -q이 다른지 합니다. - 파일이 다른지 여부만 출력합니다.
comm -23 <(ls dir1 |sort) <(ls dir2|sort)

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

해서에 <( )사인, '공정 대체'로 구글에서 검색할 수 있습니다.

은 '비교'를 사용하는 입니다.findmd5sum에 a , , , , , , a.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/)는 디렉토리와 그 안의 파일을 매우 잘 비교합니다.

Meldeld

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

P.S. 파일사이즈와 파일해시를 비교하고 싶은 경우는, https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779 에서 갱신된 스크립트를 공개합니다.

또 다른 접근법(대규모 디렉토리의 경우 더 빠를 수 있음):

$ find dir1 | sed 's,^[^/]*/,,' | sort > dir1.txt && find dir2 | sed 's,^[^/]*/,,' | sort > dir2.txt
$ diff dir1.txt dir2.txt

sed명령어는 Erik의 투고 덕분에 첫 번째 디렉토리 컴포넌트를 삭제합니다.)

조금 늦었지만 누군가 도움이 될 수도 있습니다.diff 또는 rsync가 이렇게 파일 이름만 출력하는지 확실하지 않습니다.아래에 자세히 설명한 멋진 솔루션을 제공해 주셔서 감사합니다.

필요한 파일을 깨끗한 형식으로 복사하기 쉽게 파일 이름만 원하는 경우 find 명령을 사용할 수 있습니다.

comm -23 <(find dir1 | sed 's/dir1/\//'| sort) <(find dir2 | sed 's/dir2/\//'| sort) | sed 's/^\//dir1/'

이것은 dir1과 dir2가 모두 같은 부모 폴더에 있다고 가정합니다.sed는 사과와 사과를 비교할 수 있도록 부모 폴더를 삭제합니다.마지막 sed는 dir1 이름을 되돌립니다.

파일만 원하는 경우:

comm -23 <(find dir1 -type f | sed 's/dir1/\//'| sort) <(find dir2 -type f | sed 's/dir2/\//'| sort) | sed 's/^\//dir1/'

디렉토리의 경우도 마찬가지입니다.

comm -23 <(find dir1 -type d | sed 's/dir1/\//'| sort) <(find dir2 -type d | sed 's/dir2/\//'| sort) | sed 's/^\//dir1/'

수락된 답변에는 두 디렉토리에 존재하지만 내용이 다른 파일도 나열됩니다.dir1에 있는 파일만 나열하려면 다음을 사용합니다.

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

설명:

  • diff - r dir1 dir2 : 비교
  • grep 'Only in': 'Only in'이 포함된 행을 가져옵니다.
  • grep dir1 : dir를 포함하는 행을 가져옵니다.

은 @Adail-Junior를 하여 @ 중 합니다.-D이 옵션은 비교 대상 디렉토리가 git 저장소가 아닐 때 유용합니다.

git diff -D --no-index dir1/ dir2/

사용하시는 경우-D그러면 와 비교가 되지 않습니다./dev/null:text Binary files a/whatever and /dev/null differ

DIF 명령어를 사용하여2개의 디렉토리를 간단하게 비교하는 방법

diff filename.1 filename.2 > filename.dat > > 입력

실행 완료 후 filename.dat을 엽니다.

다음과 같이 표시됩니다.파일 이름만.1: filename.2in: directory_name: name_of_file1 only: directory_Name: name_of_file2

이것은 두 개의 디렉토리를 동기화하기 위한 명령을 인쇄하기 위한 bash 스크립트입니다.

dir1=/tmp/path_to_dir1
dir2=/tmp/path_to_dir2
diff -rq $dir1 $dir2 | sed -e "s|Only in $dir2\(.*\): \(.*\)|cp -r $dir2\1/\2 $dir1\1|" |  sed -e "s|Only in $dir1\(.*\): \(.*\)|cp -r $dir1\1/\2 $dir2\1|" 

GNUgrep옵션을 사용하여 검색을 반전시킬 수 있습니다.-v이렇게 하면grep일치하지 않는 행을 보고합니다.이것으로, 에 있는 파일을 삭제할 수 있습니다.dir2의 파일 목록에서dir1.

grep -v -F -x -f <(find dir2 -type f -printf '%P\n') <(find dir1 -type f -printf '%P\n')

옵션-F -x말하다grep전체 행에서 문자열 검색을 수행합니다.

언급URL : https://stackoverflow.com/questions/16787916/find-the-files-existing-in-one-directory-but-not-in-the-other

반응형