모든 바이너리 파일을 무시하고 디렉토리를 재귀 적으로 비교합니다.
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
find
및 file
명령 의 조합을 사용하십시오 . 이를 위해서는 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
'code' 카테고리의 다른 글
IntelliJ IDEA에서 '기본 gradle 래퍼'의 버전을 변경하는 방법은 무엇입니까? (0) | 2020.10.27 |
---|---|
얼마나 많은 소켓 연결이 가능합니까? (0) | 2020.10.27 |
Chrome 확장 프로그램 : 모든 페이지로드를 실행합니다. (0) | 2020.10.26 |
HTML 요소를 JavaScript 개체로 기록하려면 어떻게해야합니까? (0) | 2020.10.26 |
Python : 특정 버전 2.4.9로 opencv2를 pip 설치하는 방법은 무엇입니까? (0) | 2020.10.26 |