한 디렉토리에 존재하지만 다른 디렉토리에는없는 파일을 찾으려고 노력 중입니다.이 명령을 사용하려고했습니다.
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에있는 파일을 제공합니다 .
정보 <( )
기호, 당신은 ‘공정 대체’로 구글 수 있습니다.
답변
이 비교를 할 수있는 좋은 방법은 사용하는 것입니다 find
와 md5sum
다음, 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에 업데이트 된 스크립트를 게시했습니다.