파일 이름 만 출력하는 diff


244

두 디렉토리를 재귀 적으로 비교하고 다른 파일 이름 출력하는 Linux 명령을 실행하려고 합니다. 여기에는 한 디렉토리에 존재하고 다른 디렉토리에는 존재하지 않는 모든 내용과 텍스트 차이가 포함됩니다.

답변:


376

diff 맨 페이지에서 :

-q   차이점에 대한 세부 정보가 아니라 파일이 다른지 여부 만보고하십시오.
-r   디렉토리를 비교할 때 발견 된 서브 디렉토리를 재귀 적으로 비교하십시오.

명령 예 :

diff -qr dir1 dir2

출력 예 (로케일에 따라 다름) :

$ ls dir1 dir2
dir1:
same-file  different  only-1

dir2:
same-file  different  only-2
$ diff -qr dir1 dir2
Files dir1/different and dir2/different differ
Only in dir1: only-1
Only in dir2: only-2

감사합니다 diff-CentOS 7 의 매뉴얼 페이지는 -q"파일이 다를 때만보고"로 설명 합니다.
Chap

2
이것은 종종 원하는 파일의 실제 내용을 비교하지만, rsync 응답은 내용이 아니라 파일 이름과 크기 만 볼 수있는 옵션을 제공합니다. 때로는 바람직합니다.
steveb 2019

macOS에서도 작동합니다.
Marius Soutier

또한 -x PATTERN특정 하위 디렉토리를 제외하도록 명령에 포함시킬 수 있습니다 . 예를 들어 diff -qr repo1 repo2 -x ".git" 두 디렉토리를 비교하지만 파일 경로가 ".git"인 파일은 제외합니다.
ViFI

27

rsync를 사용할 수도 있습니다

rsync -rv --size-only --dry-run /my/source/ /my/dest/ > diff.out

6
--size-only크기는 동일하지만 내용이 다른 파일 (예 : old / version.txt "29a" new / version.txt "29b") 이 누락됩니다 . 대신 rsync -ric --dry-run old/ new/"-i"인수를 사용하여 다음을 통해 파일 목록을 직접 얻을 수 있습니다.rsync -ric --dry-run old/ new/ | cut -d" " -f 2
iolsmit

6
이는 내용을 비교하지 않기 때문에 누락 된 파일 (특히 네트워크 공유에서) 만 찾는 경우에 좋습니다 . 이를 통해 새 NAS로 마이그레이션 할 때 실패한 몇 가지 파일을 찾을 수있었습니다.
OverZealous

4
rsync의 명령 행에 지정된 경로에 후행 슬래시를 포함 시키십시오. 그것들이 없으면 올바르게 작동하지 않으며 rsync는 모든 파일 이름을 열거 할 것입니다!
블라디미르 판 텔레 예프

2
내용을 확인하지 않는 것에 대한 의견과 관련하여. 이것은 적어도 첫번째 패스로서 때때로 바람직하다.
steveb 2019

13

하나의 디렉토리에만 있고 하위 디렉토리가 아닌 파일 이름 만있는 파일 목록을 얻으려면 다음을 수행하십시오.

diff -q /dir1 /dir2 | grep /dir1 | grep -E "^Only in*" | sed -n 's/[^:]*: //p'

전체 경로와 다른 모든 파일과 디렉토리를 재귀 적으로 나열하려면 다음을 수행하십시오.

diff -rq /dir1 /dir2 | grep -E "^Only in /dir1*" | sed -n 's/://p' | awk '{print $3"/"$4}'

이렇게하면 모든 파일에 다른 명령을 적용 할 수 있습니다.

예를 들어 dir1에는 있지만 dir2에는없는 모든 파일과 디렉토리를 제거 할 수 있습니다.

diff -rq /dir1 /dir2 | grep -E "^Only in /dir1*" | sed -n 's/://p' | awk '{print $3"/"$4}' xargs -I {} rm -r {}

9

내 리눅스 시스템 에서 파일 이름 얻으 십시오.

diff -q /dir1 /dir2|cut -f2 -d' '

7
리눅스 시스템에 파일 이름을 공백으로 넣지 않습니다. ;)
gerardw

6
나는 이것을 당신에게 전가하려는 의도는 아니
었습니다

나를 위해 작동하지 않습니다. 내 디렉토리 구조는 다음과 같습니다audit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
Alex Raj Kaliamoorthy

diff -qrN /dir1 /dir2 | cut -f2 -d' '나를 위해 잘 작동합니다!
Francesco

9

실행 방법 diff -qr old/ new/에는 한 가지 큰 단점이 있습니다. 새로 작성된 디렉토리의 파일이 누락 될 수 있습니다. 예를 들어 아래 예에서 파일 data/pages/playground/playground.txt은 출력되지 않지만 diff -qr old/ new/디렉토리 data/pages/playground/는 ( 브라우저에서 playground.txt 를 검색 하여 빠르게 비교하십시오). 또한 Unix & Linux Stack Exchange에 다음 솔루션 게시 했지만 여기에서도 복사합니다.

프로그래밍 방식으로 새 파일 또는 수정 된 파일 목록을 만들려면 rsync , sortuniq을 사용하는 것이 가장 좋습니다 .

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

이 예제를 통해 설명하겠습니다. 두 개의 dokuwiki 릴리스를 비교하여 어떤 파일이 변경되었고 어떤 파일이 새로 생성되었는지 확인하려고합니다.

우리은 wget과 타르를 가져오고 디렉토리에 압축을 풉니 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를 한 가지 방법으로 실행하면 rsync와 diff의 비교가 다음과 같이 새로 작성된 파일을 놓칠 수 있습니다.

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 동일한 크기의 파일을 비교하고 "mod-time & size가 아닌 checksum을 기준으로 건너 뛰기"만
  • -n "변경없이 시운전을 수행"
  • --out-format="%n" "지정된 FORMAT을 사용하여 업데이트 출력"(여기서 파일 이름 만 "% n"임)

rsync양방향 의 출력 (파일 목록)은 을 사용하여 결합 및 정렬 된 sort다음이 정렬 된 목록은uniq


diff new/ old/어떤 디렉토리가 삭제되었는지 확인하기 위해 뒤로 ( ) 실행할 수 없습니까?
Jacques

실행 diff -qr new/ old/도쿠 위키의 타르와 위의 예에는 동일한 출력으로 생산 diff -qr old/ new/- 즉, 당신이 디렉토리가 새로운 / 실종 아닌 파일임을 알
iolsmit가

-4
rsync -rvc --delete --size-only --dry-run source dir target dir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.