Linux

如何在排除具有特定模式的文件的同時複製所有文件?

  • February 24, 2022

我有以下文件夾和文件:

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

引用自:https://unix.stackexchange.com/questions/691909