Mac OS X 터미널을 사용하여 선택한 폴더를 병합 동작으로 새 위치에 복사

Mac OS X 터미널을 사용하여 선택한 폴더를 병합 동작으로 새 위치에 복사

나는 많은 하위 폴더를 포함하는 'foo' 폴더를 가지고 있습니다.

foo
 |---20101
 |---20102
 |---20103
 |---20111
 |---20112
 |---20113

이보다 더 많은 방법이 있지만 시나리오를 설명하기를 바랍니다. 이제 '2011'로 시작하는 이 폴더의 모든 폴더를 'bar'라는 'foo'의 형제 폴더로 복사하고 싶습니다. 그러나 'bar'에는 이미 동일한 이름을 가진 일부 폴더가 포함되어 있습니다.

bar
 |---20111
 |---20113
 |---20114

원본 폴더와 대상 폴더의 내용을 병합해야 합니다. 존재하지 않는 bar/20112 폴더도 생성해야 합니다.

저는 Mac 터미널 스크립팅을 처음 접했고 올바른 폴더를 성공적으로 찾아냈습니다.

foo>ls | grep ^2011 

올바른 폴더가 나열되어 있지만 이를 적절한 복사 작업으로 연결하는 방법을 모르겠습니다.

답변1

복사 명령은 입니다 cp. (재귀) 플래그를 지정하면 -r정확히 원하는 작업을 수행하고 파일을 기존 폴더에 복사하고 대상 폴더가 없으면 새 폴더를 만듭니다.

하지만,절대로 출력을 구문 분석해서는 안 됩니다.ls, 당신은 find또는 더 간단하게,배쉬 글로빙:

cp -rv foo/2011* bar/

이름이 로 시작하는 파일과 폴더가 있는 경우 에서 찾은 모든 항목에 제공하는 명령을 적용하는 해당 옵션을 사용 2011하십시오 ( 참조 ).find-execfind{}

find foo/ -type d -name "2011*" -exec cp -rv '{}' bar/ \;

이 특별한 경우에는 명령의 출력을 저장하고 에 전달할 이유가 없습니다 cp. 때로는 필요한 경우도 있으므로 수행 방법은 다음과 같습니다. 일반적으로 명령의 출력은 반전된 쉼표 또는 $(). 안에 배치되면 다른 명령의 입력으로 제공될 수 있습니다.

cp -rv `find foo/ -type d -name "2011*"` bar/

또는

cp -rv $(find foo/ -type d -name "2011*") bar/

또는 결과를 반복할 수 있습니다.

for dir in $(find foo/ -type d -name "2011*"); do cp -rv "$dir" bar/; done

파일/폴더 이름에 특수 문자나 새 줄 등이 포함될 수 있으면 상황이 더 복잡해집니다. 이 경우 다음과 같이 해야 합니다.

find foo/ -type d -name "2011*" | while IFS= read -r dir; do 
       cp -rv "$dir" bar/; 
done

관련 정보