동일한 하위 디렉터리 경로를 사용하여 여러 디렉터리에 파일을 복사하는 방법은 무엇입니까?

동일한 하위 디렉터리 경로를 사용하여 여러 디렉터리에 파일을 복사하는 방법은 무엇입니까?

나는 git commit Hook을 작성하고 이라는 저장소에서 테스트했습니다 myrepo. 이제 ~/repos폴더의 모든 저장소 에 복사하고 싶습니다 . 이를 위해 나는 다음을 시도했습니다.

$ cd ~/repos/myrepo/.git/hooks
$ cp prepare-commit-msg ~/repos/*/.git/hooks

이것을 실행하면 cp각 디렉토리에 다음 메시지가 나타납니다 repos.

cp: -r not specified; omitting directory <directory-name>

prepare-commit-msg나는 이것이 디렉토리가 아니라고 100% 확신합니다 . 왜 cp내가 그것을 사용하지 않았다고 불평합니까 -r?

답변1

find그것은 당신이 찾고 있는 도구일 수도 있습니다. 이를 사용하여 지정되고 폴더 hooks아래에 있는 모든 디렉터리를 찾을 수 있습니다 ~/repos/. 찾은 각 디렉토리에 대해 find거기에 파일을 복사하도록 지시합니다.

myrepo이로 인해 저장소가 파일을 자신에게 복사하려고 시도할 때 오류 메시지가 표시되지만 오류는 무시할 수 있습니다.

cd ~/repos/myrepo/.git/hooks
find ~/repos/ -type d -name hooks -exec cp -vp prepare-commit-msg {} \;

이 명령은 디렉터리나 파일 이름에 이상한 문자가 있는 경우를 처리하도록 개선될 수 있지만 이것이 요점입니다.

원래 cp명령이 작동하지 않는 이유에 대해 더 잘 설명하는 질문이 있을 수 있지만 이는 셸이 명령을 다음과 같이 확장하기 때문입니다.

cp prepare-commit-msg ~/repos/repo_A/.git/hooks ~/repos/repo_B/.git/hooks ~/repos/repo_C/.git/hooks ~/repos/repo_D/.git/hooks ~/repos/repo_E/.git/hooks

해당 구문이 주어 cp지면 파일 prepare-commit-msg과 4개의 디렉터리를 복사 ~/repos/repo_A/.git/hooks하고 ~/repos/repo_D/.git/hooks복사된 모든 파일/디렉터리 를 ~/repos/repo_E/.git/hooks. t 디렉토리를 재귀적으로 복사합니다.cp-r

원래 구문과 유사한 솔루션을 구축하려면 다음을 사용할 수 있습니다.

cd ~/repos/myrepo/.git/hooks
dirs=( ~/repos/*/.git/hooks )
for d in "${dirs[@]}"
do
    cp -vp prepare-commit-msg "$d/"
done

ls구문 분석된 출력을 포함하는 방법은 권장되지 않습니다.

답변2

cp자신만의 래퍼를 사용할 수 있습니다 cp2dirs.

function cp2dirs(){
  from="$1";shift
  [ -f "$from" ] && while (($#)); do cp "$from" "$1/"; shift; done
}

그리고 cp2dirs prepare-commit-msg ~/repos/*/.git/hooks

관련 정보