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