特定のパターンのファイルを除いてすべてのファイルをコピーする方法は?

特定のパターンのファイルを除いてすべてのファイルをコピーする方法は?

次のフォルダとファイルがあります。

.
├── 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にコピーしたいです。デフォルトでは、ファイルで終わるファイルはすべて除外し、ファイルで終わるファイルだけをコピーしたいと思います。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/

または、1つもない場合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/

おすすめ記事