경로를 기반으로 여러 파일을 여러 위치에 복사하는 방법은 무엇입니까?

경로를 기반으로 여러 파일을 여러 위치에 복사하는 방법은 무엇입니까?

macOS에서 내 폴더 구조는 다음과 같습니다

├── src
    └── components
        └── componentA
            └── README.md
        └── componentB
            └── README.md
└── destination
    └── components
        ├── componentA
        └── componentB

README.md단일 명령으로 모든 것을 소스 기반 매핑 src에 복사하는 방법이 무엇인지 알고 싶습니다.destination

답변1

다음에서 루프를 사용하십시오 bash.

shopt -s nullglob dotglob globstar

for srcfile in src/**/README.md; do
    destfile=destination/${srcfile#src/}
    mkdir -p "${destfile%/*}" &&
    cp "$srcfile" "$destfile"
done

여기서는 **glob( globstar쉘 옵션을 설정하여 활성화됨 )을 사용하여 디렉토리 의 모든 파일을 bash반복합니다 .README.mdsrc

각 파일에 대해 대상 경로 이름은 src/초기 문자열을 . destination/그런 다음 대상 디렉터리를 만들고 파일을 복사합니다.

nullglob옵션은 패턴이 어떤 이름과도 일치하지 않는 경우 루프가 전혀 실행되지 않도록 보장하고 tho dotglob옵션은 숨겨진 이름의 일치를 활성화합니다.

모든 파일을 복사하시겠습니까 *.md? 패턴으로 *.md대신 사용해 주세요.README.md


모든 셸을 사용하여 전체 프로세스를 단일 명령으로 실행할 수 있습니다.

bash -O globstar -O nullglob -O dotglob -c 'for s in src/**/README.md; do d=destination/${s#src/}; mkdir -p "${d%/*}" && cp "$s" "$d"; done'

, 를 사용하여 찾은 파일이 일반 파일인지 find확인하기 위해 추가 검사를 수행합니다 .README.md

find src -type f -name README.md -exec sh -c '
    for srcfile do
        destfile=destination/${srcfile#src/}
        mkdir -p "${destfile%/*}" &&
        cp "$srcfile" "$destfile"
    done' sh {} +

sh -c인라인 스크립트의 루프 본문이 다음과 같다는 것은 놀라운 일이 아닙니다.정확히 똑같다bash최상위 스크립트의 루프에.

답변2

그리고 GNU cp:

cd src
cp --parents -t ../destination components/*/README.md

OSX 버전 에는 이 옵션이 cp없습니다 --parents.

rsync그런 다음 다음을 사용할 수 있습니다.

rsync -av --include '*/' --include='*/README.md' --exclude='*' src/ destination

답변3

처음에는 npm 스크립트로 등록할 수 있는 명령어가 있으면 좋겠다고 생각했는데, 결국 아래와 같은 해결 방법을 생각해냈습니다.

components=(src/components/*)
for dir in "${components[@]}"; 
do 
  files=($dir/*.md)
  folder_name=${dir##*/}
  for file in "${files[@]}";
  do
    mkdir -p "destination/$folder_name/";
    cp "$file" "destination/$folder_name/";
  done
done

답변4

특정 폴더 구조에 대해...이 명령줄만 작동합니다.

cd src; for i in `find . -name README.md`; do cp $i ../destination/$i; done; cd ..

그것이 당신에게 도움이 되기를 바랍니다

관련 정보