Linux
如何在排除具有特定模式的文件的同時複製所有文件?
我有以下文件夾和文件:
. ├── 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
副檔名結尾。我怎樣才能做到這一點?
有幾個選擇浮現在腦海中。
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
,這裡告訴 shell 匹配名稱中不包含.meta
的所有內容:shopt -s extglob cp -av photos/*/!(*.meta).json photos-copy/