다음 파일이 있다고 가정해 보겠습니다.
old/common-change/index.html
new/common-change/index.html
new/only-new/index.html
old/only-old/index.html
출력은 diff -qr
내가 원하는 것과 가깝습니다.
$ diff -qr old/ new/
Files old/common-change/index.html and new/common-change/index.html differ
Only in new/: only-new
Only in old/: only-old
그러나 에만 있는 파일의 경우 new/
파일 이름을 원합니다. 단지 상위 디렉토리만이 아닙니다. 을 사용해 보았지만 diff -qrN
에 있는 항목만 쉽게 필터링할 수 없습니다 old/
.
$ diff -qrN old/ new/
Files old/common-change/index.html and new/common-change/index.html differ
Files old/only-new/index.html and new/only-new/index.html differ
Files old/only-old/index.html and new/only-old/index.html differ
에 포함되어 있지만 다른 것을 찾고 싶기 때문에 에 new/
포함된 것만 제거하고 싶습니다 old/
.
diff
출력을 얻으려는 유일한 파일은 다음과 같습니다.
new/common-change/index.html
new/only-new/index.html
중요한 경우 마지막 커밋 이후 웹 사이트 저장소의 어떤 페이지가 변경되었는지 파악하고 싶습니다. 이전 버전을 로 old/
, 현재 버전을 로 빌드하고 있습니다 new/
. 따라서 변경된 모든 페이지에서 테스트를 실행하고 싶지만 삭제된 페이지는 무시하고 싶습니다(존재하지 않는 페이지에서는 테스트를 실행할 수 없기 때문입니다).
답변1
를 사용하면 zsh
다음을 수행할 수 있습니다.
zmodload zsh/stat
old=(old/**/*(ND-.)); old=(${old#old/})
new=(new/**/*(ND-.)); new=(${new#new/})
# in new, not in old:
new_files=(${new:|old})
# loop over files common to both sets:
for file (${old:*new}) {
stat -A old_size +size -- old/$file || continue
stat -A new_size +size -- new/$file || continue
# compare size to avoid calling cmp as an optimisation
(( old_size == new_size )) ||
cmp -s -- {old,new}/$file ||
new_files+=($file)
}
결과를 에 넣고 $new_files
유사한 방법을 사용하여 각 항목에 ls -ld -- new/$^new_files
목록을 전달합니다 .new/
ls
답변2
아마도 최선의 해결책은 아닐 수도 있지만 일련의 파이프를 사용하여 뭔가를 알아냈습니다.
diff -qrN old/ new/ |
grep -oP '(?<=\s)new\/\S*' |
xargs -rd '\n' ls -1d 2>/dev/null
이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다.
답변3
한 가지 옵션은 이를 dry-run + checksum 모드에서 사용하는 것입니다 rsync
. 여기서 결과를 bash 4.4+ 배열에 저장하고 rsync를 사용하여 시퀀스를 perl
디코딩하여 일부 바이트 값을 인코딩합니다.\#ooo
readarray -td '' new_files < <(
rsync --out-format=%f -rcn new/ old/ |
perl -p -l0 -e 's/\\#([0-7]{3})/chr(oct($1))/ge'
)
에서와 같이 매개변수 확장 플래그를 zsh
사용하여 0
NUL로 구분된 목록을 분할합니다.
new_files=(
${(0)"$(
rsync --out-format=%f -rcn new/ old/ |
perl -p -l0 -e 's/\\#([0-7]{3})/chr(oct($1))/ge'
)"}
)