다음과 같은 폴더와 파일이 있습니다.
.
├── photos
│ ├── photo-a
│ │ ├── photo-a.meta.json
│ │ └── photo-a.json
│ ├── photo-b
│ │ ├── photo-b.meta.json
│ │ └── photo-b.json
...
There are more folders and files in the photos folder in the same structure
모든 파일 및 기타 파일을 이라는 다른 파일 photo-a.json
로 복사하고 싶습니다 . 기본적으로 files로 끝나는 파일은 모두 제외 하고 files로 끝나는 파일만 복사하고 싶습니다 .photo-b.json
photos-copy
.meta.json
.json
따라서 올바르게 완료되면 photos-copy
폴더는 다음과 같습니다.
.
├── photos-copy
│ ├── photo-a.json
│ └── photo-b.json
...
몇 가지를 시도했지만 cp -a ./photos/*.json ./photos-copy
파일 .meta.json
확장자가 .json
.
어떻게 해야 하나요?
답변1
몇 가지 옵션이 떠올랐습니다.
rsync --dry-run -av --prune-empty-dirs --exclude '*.meta.json' --include '*.json' photos/ photos-copy/
또는 하나도 없는 경우 rsync
(왜 안되나요!?) 구조를 유지하면서 파일을 복사합니다.
cp -av photos/ photos-copy/
rm -f photos-copy/*/*.meta.json
이 변형은 파일을 단일 디렉터리로 병합합니다.
cp -av photos/*/*.json photos-copy/
rm -f photos-copy/*.meta.json
이름이 포함되지 않은 모든 항목 bash
과 일치하도록 셸에 지시하는 확장된 패턴 일치를 사용하면 더 멋진 작업을 수행할 수 있습니다 ..meta
shopt -s extglob
cp -av photos/*/!(*.meta).json photos-copy/
답변2
재동기화를 사용하세요:rsync -rv --include="*/" --exclude="*.meta.json" --include "*.json" --exclude="*" ./photos/ photo-copy/
원래 디렉토리 구조:
photo-a/photo-a.json
photo-a/photo-a.meta.json
photo-b/photo-b.json
photo-b/photo-b.meta.json
photo-b/photo-b.son
산출:
sending incremental file list
photo-a/photo-a.json
photo-b/photo-b.json
이전 답변의 ( ) 출력으로 rsync --dry-run -av --prune-empty-dirs --exclude '*.meta.json' --include '*.json' photos/ photos-copy/
시도했습니다 .
photo-a/photo-a.json
photo-b/
photo-b/photo-b.json
photo-b/photo-b.son
참고: rsync의 포함/제외 순서가 중요합니다. 모든 하위 디렉터리를 포함하는 것부터 시작하세요. Meta.json을 제외하고, .json을 포함하고, 다른 모든 항목을 제외합니다.