Linux에는 다음 구조의 두 개의 디렉토리 image와 image2가 있습니다.
/images/ad
/images/fe
/images/foo
...및 기타 4000개 폴더
또 다른 하나는 이렇습니다.
/images2/ad
/images2/fe
/images2/foo
...및 기타 4000개 폴더
이러한 각 폴더에는 이미지가 포함되어 있으며 이미지와 이미지2 아래의 디렉터리는 이름은 동일하지만 내용이 다릅니다. 그런 다음 4000개 폴더 모두에 대해 /images2/ad의 이미지를 Images/ad로, /images2/foo를 Images/foo로 복사하고 병합하는 방법을 알고 싶습니다.
답변1
이건 직업이야동기화. 파일을 복사하는 대신 파일을 이동하려는 경우가 아니면 셸 루프를 사용하여 수동으로 이 작업을 수행하는 데는 이점이 없습니다.
rsync -a /path/to/source/ /path/to/destination
귀하의 경우:
rsync -a /images2/ /images/
( 의 후행 슬래시에 주의하세요 images2
. 그렇지 않으면 에 복사됩니다 /images/images2
.)
위의 명령은 동일한 이름의 이미지가 두 디렉터리에 모두 존재하는 경우 /images/SOMEPATH/SOMEFILE
덮어쓰게 됩니다 /images2/SOMEPATH/SOMEFILE
. 이전 파일만 바꾸려면 옵션을 추가하세요 -u
. 항상 이 버전을 유지하려면 /images
이 옵션을 추가하세요 --ignore-existing
.
rsync를 사용하여 파일을 이동하려면 /images2
옵션을 전달할 수 있습니다 --remove-source-files
. 그런 다음 rsync는 모든 파일을 순서대로 복사하고 완료되면 각 파일을 삭제합니다. 이는 소스 및 대상 디렉토리가 동일한 파일 시스템에 있는 경우 이동하는 것보다 훨씬 느립니다.
답변2
이미 게시한 대로 가장 좋은 옵션은 물론입니다 rsync
. unison
일반적으로 소프트웨어 패키지를 설치해야 하지만 작업에 적합한 소프트웨어 입니다 . 둘 다 다양한 운영 체제에서 사용할 수 있습니다.
동기화
rsync는 소스에서 대상으로 단방향으로 동기화합니다. 따라서 다음 진술
rsync -avh --progress Source Destination
모든 것을 동기화원천도착하다목적지. 병합된 폴더는 다음 위치에 있습니다.목적지.
-ㅏ"아카이브"를 의미하며 원본에서 대상까지 모든 것을 반복적으로 복사하여 거의 모든 것을 보존합니다.
-V더 많은 출력("verbose")을 제공합니다.
-시간인간의 가독성을 위해.
- 진전얼마나 많은 작업이 완료되었는지 보여줍니다.
네가 원한다면고쳐 쓰다이것목적지폴더최신으로소스 폴더의 파일:
rsync -avhu --progress source destination
조화
unison은 양방향으로 동기화됩니다. 그러므로 다음 진술은
unison Source Destination
최종 소스가 대상과 동일하도록 두 디렉터리를 양방향으로 동기화합니다. 이는 소스에서 대상으로 또는 그 반대로 rsync를 두 번 실행하는 것과 같습니다.
보다 고급 사용법을 보려면 매뉴얼 페이지나 다음 웹사이트를 참조하십시오.
답변3
디렉토리가 다음과 --link
같은 경우 옵션을 사용하여 두 디렉토리를 병합하는 더 빠르고 공간 효율적인 방법이 있습니다.cp
동일한 파일 시스템에서, 관련 기사의 여러 가지 답변에 설명되어 있습니다. (기사 제목이 사용자의 질문과 정확히 일치하지 않으며 답변은 사용자의 실제 문제를 해결하기보다는 제목 주제인 병합 문제를 다루고 있습니다.)
옵션은 파일 데이터를 복사하지 않음을 --link
의미합니다 . 그 안에 있는 모든 항목이 이전 항목을 대체하는 cp
경우를 예로 들 수 있습니다 ./images2
/images
cp --force --archive --update --link /images2/. /images
로 병합한 /images
후rm -rf /images2
/images2/x
파일 트리 병합의 어느 곳에서나 디렉터리를 동일한 이름을 가진 기존 파일이나 심볼릭 링크에 병합하려고 시도하는 경우, 즉 지정된 디렉터리를 동일한 이름을 가진 기존 파일이나 심볼릭 링크에 병합하지 않으며 /images/x
For 오류가 발생하는 경우 이와 같이 파일이나 심볼릭 링크를 수동으로 삭제하고 명령을 다시 실행할 수 있습니다.
이점은 --link
디렉터리를 병합하기 위해 데이터가 이동되지 않는다는 것입니다.
답변4
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done
확장된 glob을 사용하여 모든 항목을 반복한 다음 images2
(파싱 문제를 방지하기 위해 ls
) mv
해당 항목의 내용을 의 일치하는 항목에 추가합니다 images
. 와일드카드 경로에서 선행 문자를 제거하는 데 사용됩니다 basename
.images2