나는 많은 하위 폴더를 포함하는 '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
-exec
find
{}
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