두 디렉토리를 복사 병합하는 방법?


112

Linux 에서이 구조를 가진 두 개의 디렉토리 이미지와 이미지 2가 있습니다.

/images/ad  
/images/fe  
/images/foo  

... 및 기타 4000 폴더

다른 하나는 다음과 같습니다.

/images2/ad  
/images2/fe  
/images2/foo

... 및 기타 4000 폴더

이러한 각 폴더에는 이미지가 포함되어 있으며 images와 images2 아래의 디렉토리 이름은 정확히 동일하지만 내용이 다릅니다. 그런 다음 모든 4000 폴더에서 / images2 / ad 이미지를 images / ad로, / images2 / foo 이미지를 images / foo로 복사 병합하는 방법을 알고 싶습니다.


1
두 디렉토리에서 최종 파일 이름이 동일합니까?
Simply_Me

아니요. 예를 들어 images / ad에서 1.jpg, 2.jpg 및 3.jpg입니다. 그러나 images2 / 광고에 4.jpg하고 5.jpg
ssierral

4
@ AmirAliAkbari, 나는 그것이 중복이라고 생각하지 않습니다. 다른 질문은 기본적으로 'mv가 병합합니까?'입니다. (답변 : 아니오). 이 질문은 2 개의 디렉토리 계층을 병합하는 방법에 관한 것입니다.
maxschlepzig

답변:


173

이것은 rsync 의 작업입니다 . 파일을 복사하지 않고 이동하려는 경우가 아니라면 셸 루프를 사용하여 수동으로이 작업을 수행하면 이점이 없습니다.

rsync -a /path/to/source/ /path/to/destination

귀하의 경우 :

rsync -a /images2/ /images/

(슬래시 on에 유의하십시오 . images2그렇지 않으면에 복사됩니다 /images/images2.)

같은 이름을 가진 이미지가 두 디렉토리에있는 경우, 위의 명령을 덮어 쓰게됩니다 /images/SOMEPATH/SOMEFILE/images2/SOMEPATH/SOMEFILE. 이전 파일 만 바꾸려면 옵션을 추가하십시오 -u. 항상 버전을 유지 /images하려면 옵션을 추가하십시오 --ignore-existing.

/images2rsync를 사용 하여에서 파일을 이동하려는 경우 옵션을 전달할 수 있습니다 --remove-source-files. 그런 다음 rsync는 모든 파일을 차례로 복사하고 완료되면 각 파일을 제거합니다. 소스 및 대상 디렉토리가 동일한 파일 시스템에있는 경우 이동하는 것보다 훨씬 느립니다.


14
..add -P 진행 상황을 보려면 ..
Meetai.com

1
당신이 경우에도 여기에 까다로운 쉘 루프를 사용하여 얻을 수있는 이점이 없다는 것을 추가 할 않는 그들-그냥 사용하는 경우를 복사하는 대신으로 이동하려면 rsync다음은 rm -r /images.
와일드 카드

1
또한 각 디렉토리에 슬래시를 포함하는 것이 중요하다는 점도 지적하고 싶습니다 . 예를 들어 단순히 실행 한 경우 rsync -a images images2images2를 이미지 대신 병합하는 대신 이미지에 복사합니다.
Kyle Challis

1
@ s3cur3 아. 2에서 (암시 적) 1. 직관적이지 않습니다. 고마워, 나는 대답을 고쳤다.
Gilles

1
@MaxCoplan 아니요. Rsync는 대화식 도구가 아닙니다.
Gilles

43

이미 게시 된 최선의 선택은 물론 rsync입니다. 그럼에도 불구하고 unison은이 작업을 수행하는 훌륭한 소프트웨어 일 것입니다. 둘 다 여러 운영 체제에서 사용할 수 있습니다.

재 동기화

rsync는 소스에서 대상으로 한 방향으로 동기화합니다. 따라서 다음 진술

rsync -avh --progress Source Destination

Source 에서 Destination 까지 모든 것을 동기화합니다 . 병합 된 폴더는 대상에 있습니다.

-a 는 "보관"을 의미하며 거의 모든 것을 보존하면서 소스에서 대상까지 모든 것을 재귀 적으로 복사합니다.

-v 는 더 많은 출력을 제공합니다 ( "verbose").

사람이 읽을 수있는 경우 -h

-진행된 작업량 을 보여주기 위해 진행합니다.

만 원하는 경우 업데이트 대상 폴더에 새와 소스 폴더에서 파일을 :

rsync -avhu --progress source destination

조화

unison은 양방향으로 동기화합니다. 따라서 다음 진술

unison Source Destination

두 디렉토리를 양방향으로 동기화하고 마지막으로 소스는 대상과 같습니다. 그것은 소스에서 목적지로 두 번 rsync를 수행하는 것과 같습니다.

보다 고급 사용법은 매뉴얼 페이지 또는 다음 웹 사이트를 참조하십시오.

  1. https://www.cis.upenn.edu/~bcpierce/unison/
  2. https://rsync.samba.org/

2
폴더의 올바른 경로는 끝에 슬래시가 있어야한다고 언급하고 싶습니다 rsync -avh --progress source/ destination/. 그렇지 않으면 소스 폴더가 대상 폴더에 작성됩니다.
electroid

이것은 폴더에 슬래시가있는 나에게 효과적입니다. 감사합니다!
Leopoldo Sanczyk

5
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done

images2확장 된 glob 를 사용하는 모든 내용 (구문 분석 문제를 피하기 위해 ls)을 반복 한 다음 mv해당 항목의 내용을 일치하는 항목에 반복하십시오 images. 사용 basename선두 제거하는 images2globbed 경로에서.


미래 독자들에게도 유용 할 수 있도록 명령이 수행하는 작업에 대한 자세한 내용을 추가하십시오 :)
Ramesh

1

@ inulinux12, for명령 줄에서 다음 한 줄 루프를 사용할 수 있습니다 .

$ for dir in images2/*; do mv "$dir"/* "${dir/2/}"; done

그러면 모든 파일 이 해당 디렉토리 에서 images2로 이동합니다 images. 참고 : 이것은 동일한 이름을 가진 파일이 없다고 가정합니다.

예를 들면 다음과 같습니다.

실행하기 전에 :

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2
images/adfoo:
jpg.7
images/fe:
jpg.5
images2:
ad  adfoo  fe
images2/ad:
jpg.3
images2/adfoo:
jpg.6
images2/fe:
jpg.4

실행 후 :

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2  jpg.3
images/adfoo:
jpg.6  jpg.7
images/fe:
jpg.4  jpg.5

3
의 출력을 구문 분석하지 마십시오 ls. mywiki.wooledge.org/ParsingLs
Etan Reisner

@EtanReisner 제안 해 주셔서 감사합니다. 질문에 주어진 정보가 있지만 꽤 좁은 시나리오처럼 보입니다.
Simply_Me

2
@Simply_Me 일반적으로 괜찮다는 사실이지만, 당신이 의지하지 않은 사건에 부딪쳤을 때 폭발하기를 원하지 않습니다. 실제로 나쁜 문제 가 발생할 수 있습니다 . 말할 것도없이 (이 경우와 같이) 간단한 글로 대체 할 수있다. 그 대답으로 내 대답을 참조하십시오.
Etan Reisner

@Simply_Me 시나리오에는 공백이있는 파일 이름이 포함되며 이는 이미지에 일반적입니다.
Gilles

@Gilles와 @Etan Reisner는 의견을 보내 주셔서 감사합니다. 감사합니다. 문자열 대체를 사용하기 위해 내 대답을 업데이트하고 테스트 했으며이 basename특정 상황에서 사용하는 것보다 빠릅니다 (이를 호출 할 필요가 없음 basename). 건설적인 의견에 다시 한번 감사드립니다.
Simply_Me
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.