예
a/
2개의 디렉토리 가 있고 여기에 b/
다음 파일이 포함되어 있다고 가정해 보겠습니다.
a/
a/foo/1
a/bar/2
a/baz/3
b/
b/foo/1
b/bar/2
만드는 것과 a/foo/1
동일 b/foo/1
하지만 a/bar/2
다릅니다 b/bar/2
.
a/
에 병합한 후 다음 b/
을 얻고 싶습니다.
a/
a/bar/2
b/
b/foo/1
b/bar/2
b/baz/3
설명하다
a/foo/
는 (재귀적으로) 와 동일하므로b/foo/
삭제합니다a/foo/
.a/bar/2
그래서b/bar/2
우리는 아무것도 하지 않습니다.a/baz/
에만 존재a/
하고 에는 존재하지 않으므로b/
로 옮깁니다b/baz/
.
기성 쉘 명령이 있습니까? 효과가 있을 것 같은 느낌은 들지만 rsync
잘 모르겠습니다 rsync
.
답변1
이 작업을 수행하는 특정 명령을 알고 있다고 말할 수는 없습니다. 하지만 해시만 사용하면 이 작업을 수행할 수 있습니다.
간단한 예는 다음과 같습니다.
#!/bin/bash
# ...some stuff to get the files...
# Get hashes for all source paths
for srcFile in "${srcFileList[@]}"
do
srcHashList+="$(md5sum "$srcFile")"
done
# Get hashes for all destination paths
for dstFile in "${dstFileList[@]}"
do
dstHashList+="$(md5sum "$dstFile")"
done
# Compare hashes, exclude identical files, regardless of their path.
for srci in "${!srcHashList[@]}"
do
for dsti in "${!dstHashList[@]}"
do
match=0
if [ "${srcHashList[$srci]}" == "${dstHashList[$dsti]}" ]
then
match=1
fi
if [ $match != 1 ]
then
newSrcList+=${srcFileList[$srci]}
newDstList+=${dstFileList[$dsti]}
fi
done
done
# ...move files after based on the new lists
특히 서로 동일한 경로를 가진 파일에만 관심이 있는 경우에는 확실히 더 깔끔하게 수행할 수 있습니다. 선형 시간으로 수행하는 것도 가능하지만 전체적인 개념은 수행 가능합니다.