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

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

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

.
├── 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/

答え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を含み、他のすべてのエントリを除外します。

関連情報