2016-11-12 3 views
0

저는 같은 정보를 포함하고 싶은 두 개의 디렉토리가 있습니다. 에만 bash는 스크립트 자체처럼, 최상위 디렉토리에있는 디렉토리와 그 내용하지만 다른하지 파일을 업데이트에 나는 기본 스크립트 cp -ur를 사용하지만 디렉토리 만 업데이트하십시오.

#!/bin/bash 

# Update the two folders 
cp -vur ../catkin_ws/src . 
cp -vur . ../catkin_ws/src 

지금은이를 변경하려면

을 썼다.

이것이 가능하지 않은 경우 업데이트 중에 특정 파일을 제외 할 수있는 방법이 있습니까?

+0

'cp'의 메뉴얼 페이지를 읽는 중, 특정 파일을 제외시키는 옵션을 찾지 못했습니다. 당신이 할 수있는 한가지 해결 방법은'cp'와'-i' 플래그를 결합하여'expect' 스크립트와 함께 폴더를 대체 할 것인지 아닌지를 묻습니다. 그렇지 않으면 먼저 폴더에있는 기존 파일을 모두 나열하고 변수에 저장하고 제외 할 파일을 제거한 다음 cp 명령을 실행할 수 있습니다. – Aserre

+0

대신 'rsync'를 사용하여 보려고합니다. 파일을 제외시킬 수있을뿐 아니라, 이미 동일한 파일 ('cp -u'보다 약간 똑똑합니다. 동일한 파일을 복사하여 새로운 타임 스탬프를 갖습니다)을 건너 뜁니다. – chepner

답변

0

../catkin_ws/src을 현재 디렉토리와 동기화하려고하고 현재 스크립트가 현재 디렉토리에 있다고 가정합니다. 이해하는 한, 내용을 포함하여 최상위 디렉토리 만 동기화하려고하지만 상위 레벨에있을 가능성이있는 다른 유형의 노드는 동기화하지 말아야합니다 (즉, 바로 ../catkin_ws/src 또는 ./). 그럼 쉽게 find 명령을 수행

: 다음 디렉토리 {} 스탠드가 발견

src_dir="../catkin_ws/src" 

find "$src_dir" -mindepth 1 -maxdepth 1 -type d \ 
    -exec cp -vru {} . \; 

find ./ -mindepth 1 -maxdepth 1 -type d \ 
    -exec cp -vru {} "$src_dir" \; 

.

더 필터링하려면 -name, -path 또는 -regex과 같은 추가 옵션을 사용할 수 있습니다. 예를 들어, 디렉토리 x 다음 스킵 : 식, 즉, 거짓 NOT 논리 연산자의 일종으로 작용하는 경우가 !

find "$src_dir" -mindepth 1 -maxdepth 1 -type d \ 
    ! -name 'x' \ 
    -exec cp -vru {} . \; 

다음 식 원인은 True를 반환한다.

위 명령의 단점은 cp 명령이 각 폴더에 대해 순차적으로 실행된다는 것입니다 (\;). 모든 소스에 대해 단일 cp 명령을 실행하려면 this 대답에 설명 된 방법을 사용할 수 있습니다.

P.

필자는 디렉토리를 동기화하는 더 좋은 방법을 제안하지 않았지만 현재 접근 방식을 수정하는 방법을 제안했습니다.