폴더가 이미 존재하는 경우에만 폴더를 다른 디렉터리 집합에 복사합니다.

폴더가 이미 존재하는 경우에만 폴더를 다른 디렉터리 집합에 복사합니다.

디렉터리 1의 폴더가 디렉터리 2에 있는 경우 한 디렉터리에서 다른 디렉터리 집합으로 폴더를 복사(덮어쓰기)하고 싶습니다.

예를 들어, 내 홈 디렉터리에 다음과 같은 폴더가 저장되어 있습니다.

home
    |admin
        |updates
            |package1
            |package2
            |package3

애플리케이션 빌드가 포함된 다른 폴더가 있습니다.

home
    |builds
        |build1
            |packages
                |package1
                |package2
                |package3
        |build2
            |packages
                |package1
                |package3
        |build3
            |rev1
                |packages
                    |package1
            |rev2
                |packages
                    |package2

"/home/updates/package" 디렉터리에 있는 "package1", "package2", "package3" 폴더를 "/home/builds" 디렉터리에 반복적으로 있는 "packages" 폴더에 복사하고 싶습니다. 해당 폴더는 이미 존재합니다.

따라서 위의 예에서는 "package1"/"package2"/"package3"이 "/home/builds/build1/packages"에 복사됩니다. "package1"만 "/home/builds/build3/rev1/packages"에 복사됩니다("package2"/"package3"은 거기에 없으므로 복사되지 않습니다).

또한 "build1"/"build2"/"build3"에는 소유자/그룹 권한이 다를 수 있으므로 대상 디렉터리와 관련된 권한을 유지하고 싶습니다.

답변1

mkdir -p test/updates/pack1
...
mkdir -p test/builds/builds1/packages/pack3
...
touch test/updates/pack1/f1-1
...

이 명령을 실행하세요

find test/builds -type d  -name packages -exec bash -c 'for pk in "$1"/pack* ; do cp -r test/updates/"${pk##*/}" $1 ; done' none {} \;

인사

답변2

for i in package1 package2 package3; do find /home/ -name $i -type d -not -path "/home/admin/updates/$i" -exec cp /home/admin/updates/$i/* {} \;; done
  • for i in package1 package2 package3; ... ; done- 폴더 이름 반복

  • find /home/ -name $i -type d- /home/ 디렉터리에서 위 이름을 가진 모든 폴더를 반복적으로 찾습니다.

  • -not -path "/home/admin/updates/$i"- 검색 결과에서 원래 디렉토리를 제외합니다.

  • -exec cp /home/admin/updates/$i/* {} \;- 명령 실행 - 원본 폴더에서 찾은 폴더로 파일 복사

관련 정보