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.md
src
각 파일에 대해 대상 경로 이름은 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 ..
그것이 당신에게 도움이 되기를 바랍니다