次のフォルダとファイルがあります。
.
├── 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.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/
または、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を含み、他のすべてのエントリを除外します。