code

모든 바이너리 파일을 무시하고 디렉토리를 재귀 적으로 비교합니다.

codestyles 2020. 10. 27. 08:14
반응형

모든 바이너리 파일을 무시하고 디렉토리를 재귀 적으로 비교합니다.


Fedora Constantine 상자에서 작업 중입니다. diff소스 변경 사항을 확인하기 위해 두 개의 디렉토리를 재귀 적으로 찾고 있습니다. 프로젝트 설정으로 인해 (말한 프로젝트에 참여하기 전에! sigh ) 디렉토리에는 소스와 바이너리, 그리고 대규모 바이너리 데이터 세트가 모두 포함됩니다. diffing은 결국 이러한 디렉토리에서 작동하지만 바이너리 파일을 무시할 수 있다면 20 초 정도 걸릴 것입니다.

내가 아는 한, diff에는 '바이너리 파일 무시'모드가 없지만 파일 에서 정규식을 무시하는 무시 인수 가 있습니다. 확장자에 관계없이 바이너리 파일을 무시하기 위해 거기에 무엇을 써야할지 모르겠습니다.

다음 명령을 사용하고 있지만 바이너리 파일을 무시하지 않습니다. 이 명령을 수정하는 방법을 아는 사람이 있습니까?

diff -rq dir1 dir2

바이너리 파일을 정렬하기위한 필터로 ( grep -I와 동등 함 grep --binary-files=without-match)을 사용할 수 있습니다.

dir1='folder-1'
dir2='folder-2'
IFS=$'\n'
for file in $(grep -Ilsr -m 1 '.' "$dir1"); do
   diff -q "$file" "${file/${dir1}/${dir2}}"
done

일종의 속임수이지만 내가 사용한 것은 다음과 같습니다.

diff -r dir1/ dir2/ | sed '/Binary\ files\ /d' >outputfile

이것은 dir1을 dir2와 재귀 적으로 비교하고, sed는 바이너리 파일 ( "Binary files"로 시작)에 대한 줄을 제거한 다음 출력 파일로 리디렉션됩니다.


나는 비슷한 것을 찾고이 (오래된) 질문에 왔습니다 (기본 아파치 설치와 비교하여 레거시 프로덕션 서버의 구성 파일). 주석에서 @fearlesstost의 제안에 따라 git충분히 가볍고 빠르기 때문에 위의 제안 중 어느 것보다 더 간단합니다. version1을 새 디렉토리에 복사하십시오 . 다음을 수행하십시오.

git init
git add .
git commit -m 'Version 1'

이제이 디렉토리의 버전 1에서 모든 파일을 삭제하고 버전 2를 디렉토리에 복사하십시오. 이제 다음을 수행하십시오.

git add .
git commit -m 'Version 2'
git show

이것은 첫 번째 커밋과 두 번째 커밋 사이의 모든 차이점에 대한 Git 버전을 보여줍니다. 바이너리 파일의 경우 단지 다르다고 말할 것입니다. 또는 각 버전에 대한 브랜치를 만들고 git의 병합 도구를 사용하여 병합을 시도 할 수 있습니다.


프로젝트의 바이너리 파일 이름이 일반적으로하는 것처럼 특정 패턴 ( *.o,, *.so...)을 따르는 경우 해당 패턴을 파일에 넣고 -X(하이픈 X)를 사용하여 지정할 수 있습니다.

나의 내용 exclude_file

*.o
*.so
*.git

명령:

diff -X exclude_file -r . other_tree > my_diff_file

최신 정보:

-x대신을 사용 -X하여 파일이 아닌 명령 줄에서 제외 패턴을 지정할 수 있습니다 .

diff -r -x *.o -x *.so -x *.git dir1 dir2

findfile명령 의 조합을 사용하십시오 . 이를 위해서는 file디렉토리 에있는 명령 의 출력에 대해 조사해야합니다 . 아래에서 비교하려는 파일이 ascii로보고된다고 가정합니다. 또는 grep -v이진 파일을 필터링하는 데 사용 합니다.

#!/bin/bash

dir1=/path/to/first/folder
dir2=/path/to/second/folder

cd $dir1
files=$(find . -type f -print | xargs file | grep ASCII | cut -d: -f1)

for i in $files;
do
    echo diffing $i ---- $dir2/$i
    diff -q $i $dir2/$i
done

거대한 바이너리의 이름을 알고있을 것이므로 해시 배열에 배치하고 파일이 해시에 없을 때만 diff를 수행합니다.

#!/bin/bash

dir1=/path/to/first/directory
dir2=/path/to/second/directory

content_dir1=$(mktemp)
content_dir2=$(mktemp)

$(cd $dir1 && find . -type f -print > $content_dir1)
$(cd $dir2 && find . -type f -print > $content_dir2)

echo Files that only exist in one of the paths
echo -----------------------------------------
diff $content_dir1 $content_dir2    

#Files 2 Ignore
declare -A F2I
F2I=( [sqlite3]=1 [binfile2]=1 )

while read f;
do
    b=$(basename $f)
    if ! [[ ${F2I[$b]} ]]; then
        diff $dir1/$f $dir2/$f
    fi
done < $content_dir1

조잡한 검사로 / \ 0 /와 일치하는 파일을 무시할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/6710878/diff-a-directory-recursively-ignoring-all-binary-files

반응형