누락된 파일이 있는지 두 폴더 비교

누락된 파일이 있는지 두 폴더 비교

각 폴더에 동일한 파일 이름을 가진 두 개의 다른 폴더가 있는데 폴더 중 하나에 파일이 없습니다. 두 폴더를 비교하고 Folder1그 안에 포함된 Folder2누락된 파일을 나열하려면 어떻게 해야 합니까 ?Folder2Folder1

답변1

$ tree
.
|-- dir1
|   |-- file1
|   |-- file2
|   |-- file3
|   |-- file4
|   `-- file5
`-- dir2
    |-- file2
    |-- file4
    `-- file5

2 directories, 8 files
$ for f1 in dir1/*; do f2="dir2/${f1#dir1/}"; [ ! -e "$f2" ] && printf '%s\n' "$f2"; done
dir2/file1
dir2/file3

이것은 첫 번째 디렉터리의 모든 이름을 반복하고 각 이름에 대해 두 번째 디렉터리에 있을 것으로 예상되는 파일의 해당 이름을 만듭니다. 파일이 없으면 해당 이름이 인쇄됩니다.

루프는 더 자세히 작성되었습니다( basename매개변수 대체 대신 사용하여 첫 번째 디렉터리에 있는 파일의 경로 이름에서 디렉터리 이름을 제거합니다).

for f1 in dir1/*; do
    f2="dir2/$( basename "$f1" )"
    if [ ! -e "$f2" ]; then
        printf '%s\n' "$f2"
    fi
done

두 디렉터리에 있는 파일의 이름이 동일할 뿐만 아니라 내용도 동일할 경우 다음을 사용할 수 있습니다 diff(참고: diff여기서는 BSD가 사용되었으며 GNU에는 diff다른 단어가 있을 수 있습니다).

$ diff dir1 dir2
Only in dir1: file1
Only in dir1: file3

동일한 이름을 가진 파일의 파일 내용이 다른 경우에는 관심이 없는 추가 데이터가 많이 출력될 것입니다. diff -q이 경우에는 조금 더 조용해질 수 있습니다.

diff시스템 설명서 도 참조하세요 .


더 깊은 계층 구조를 비교하려면 다음을 사용할 수 있습니다 rsync.

$ rsync -r --ignore-existing -i -n dir1/ dir2
>f+++++++++ file1
>f+++++++++ file3

위의 내용은 각 파일에 대해 한 줄을 출력하며 dir1이 파일 아래에는 해당 파일이 없습니다 dir2. 옵션 -n( --dry-run)은 파일이 실제로 로 전송되지 않도록 합니다 dir2.

옵션 -r( --recursive)은 작업을 재귀적으로 만들고 -i( --itemize-changes)는 특정 출력 형식을 선택합니다( >f더하기 기호는 파일이 수신 측에서 새로운 것임을 나타냅니다).

rsync설명서 도 참조하세요 .

관련 정보