Linux diff 도구: 수정된 파일 목록 생성

Linux diff 도구: 수정된 파일 목록 생성

Linux 명령줄 도구를 사용하여 수정된 파일 목록을 프로그래밍 방식으로 만드는 방법은 무엇입니까? 특정 파일(증분, 패치)의 차이점에는 관심이 없습니다. 이전 제품 버전과 비교하여 새 파일이나 수정된 ​​파일 목록을 얻고 싶습니다. 이렇게 하면 새 제품 업데이트를 출시할 수 있습니다.

업데이트: diff -qr매우 편리한 출력을 생성하지 않습니다. 출력 diff -qr도 처리해야 합니다. 더 좋은 방법이 있나요?

답변1

당신은 그것을 사용할 수 있습니다차이점도구: -q 및 -r 옵션 참조

-q  --brief
Output only whether files differ.

-r  --recursive
Recursively compare any subdirectories found.

예:

diff -qr dir1 dir2

답변2

간단한 방법이 있습니다. rsync-preview 모드를 사용하세요.

rsync -aHSvn --delete old_dir/ new-dir/

명령에 "삭제"라고 표시된 파일은 "새" 파일이 됩니다. 이전될 다른 콘텐츠에도 일종의 변경이 있었습니다. 자세한 내용은 rsync-man-page를 참조하세요.

답변3

diffutils패키지에는 lsdiff도구가 포함되어 있습니다. 다음의 출력을 전달하면 됩니다 diff -u.

diff -u --other-diff-options path1 path2 | lsdiff

답변4

프로그래밍 방식으로 새 파일을 생성하거나 파일 목록을 수정하려면 내가 생각할 수 있는 가장 좋은 솔루션은 다음을 사용하는 것입니다.동기화,유형, 그리고고유한:

(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq

이 예를 들어 설명하겠습니다. 두 개의 dokuwiki 버전을 비교하여 어떤 파일이 변경되었는지, 어떤 파일이 새로 생성되었는지 확인하고 싶습니다.

wget을 사용하여 tar를 가져와서 디렉토리에 추출 old/합니다 new/.

wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29d.tgz
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29.tgz
mkdir old && tar xzf dokuwiki-2014-09-29.tgz -C old --strip-components=1
mkdir new && tar xzf dokuwiki-2014-09-29d.tgz -C new --strip-components=1

rsync와 diff의 비교에 표시된 것처럼 한 가지 방법으로 rsync를 실행하면 새로 생성된 파일이 손실될 수 있습니다.

rsync -rcn --out-format="%n" old/ new/

다음과 같은 출력이 생성됩니다.

VERSION
doku.php
conf/mime.conf
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php

한 방향으로만 rsync를 실행하면 새로 생성된 파일이 누락되고, 그 반대의 경우 삭제된 파일이 누락됩니다. diff의 출력을 비교하세요.

diff -qr old/ new/

다음과 같은 출력이 생성됩니다.

Files old/VERSION and new/VERSION differ
Files old/conf/mime.conf and new/conf/mime.conf differ
Only in new/data/pages: playground
Files old/doku.php and new/doku.php differ
Files old/inc/auth.php and new/inc/auth.php differ
Files old/inc/lang/no/lang.php and new/inc/lang/no/lang.php differ
Files old/lib/plugins/acl/remote.php and new/lib/plugins/acl/remote.php differ
Files old/lib/plugins/authplain/auth.php and new/lib/plugins/authplain/auth.php differ
Files old/lib/plugins/usermanager/admin.php and new/lib/plugins/usermanager/admin.php differ

두 가지 방법으로 rsync를 실행하고 출력을 정렬하여 중복을 제거하면 data/pages/playground/처음에 디렉터리와 파일이 누락되었음을 알 수 있습니다.data/pages/playground/playground.txt

(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq

다음과 같은 출력이 생성됩니다.

VERSION
conf/mime.conf
data/pages/playground/
data/pages/playground/playground.txt
doku.php
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php

rsync다음 매개변수를 사용하여 실행하세요.

  • -r"디렉토리로 재귀",
  • -c동일한 크기의 파일을 비교하고 "수정 시간 및 크기가 아닌 체크섬 기준으로 건너뛰기"만 가능하며,
  • -n"변경 없이 시운전을 실시한다",
  • --out-format="%n""지정된 형식을 사용하여 업데이트 출력"으로 이동하세요. 여기서 "%n"은 파일 이름에만 사용됩니다.

양방향 출력(파일 목록)을 rsync결합하고 를 사용하여 정렬한 sort다음 이 정렬된 목록을 사용하여 모든 중복 항목을 제거하여 압축합니다.uniq

관련 정보