디렉터리 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 {} \;
- '찾아내겠다'는 의지재귀 검색"패키지" 디렉토리의 경우.
- '-exec bash -c'가 실행됩니다"찾기" 결과 일괄 처리.
- bash 'for' 루프는 대상에서 기존 "packX"를 검색하고 이를 소스에서 복사합니다(다음을 사용).매개변수. 확장하다) 목적지까지.
인사
답변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/* {} \;
- 명령 실행 - 원본 폴더에서 찾은 폴더로 파일 복사