특정 패턴의 파일을 제외하고 모든 파일을 복사하는 방법은 무엇입니까?

특정 패턴의 파일을 제외하고 모든 파일을 복사하는 방법은 무엇입니까?

다음과 같은 폴더와 파일이 있습니다.

.
├── 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.jsonphotos-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을 포함하고, 다른 모든 항목을 제외합니다.

관련 정보