
각 폴더에 동일한 파일 이름을 가진 두 개의 다른 폴더가 있는데 폴더 중 하나에 파일이 없습니다. 두 폴더를 비교하고 Folder1
그 안에 포함된 Folder2
누락된 파일을 나열하려면 어떻게 해야 합니까 ?Folder2
Folder1
답변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
설명서 도 참조하세요 .