Como compactar todos os arquivos de todas as subpastas se não houver 'Archive.zip' na subpasta?

0

Rawinput:

➜  datatest tree
.
├── a
│   ├── README.md
│   ├── code
│   └── data
│       └── apple.csv
├── archive.sh
├── f
│   ├── README.md
│   ├── code
│   └── data
│       ├── Archive.zip
│       ├── a.csv
│       ├── b.xlsx
│       └── c.xlsx
└── toolbox
    └── tool.py

7 directories, 9 files

Saída:

➜  datatest tree
.
├── a
│   ├── README.md
│   ├── code
│   └── data
│       ├── Archive.zip
│       └── apple.csv
├── archive.sh
├── f
│   ├── README.md
│   ├── code
│   └── data
│       ├── Archive.zip
│       ├── a.csv
│       ├── b.xlsx
│       └── c.xlsx
└── toolbox
    └── tool.py

7 directories, 10 files

Em cada subpasta / data, os arquivos devem ser compactados em Archive.zip , exceto se já existir Archive.zip (como f folder).

Tentando:

Tenho que verificar se não há Archive.zip em qualquer subpasta /data usando a linha de comando tree e, em seguida, zip -r Archive.zip ./* , que é inconveniente.

Esperança:

Como eu uso um comando uma vez ou escrevo um script para conseguir isso? Eu estou no OSX (10.12.6).

    
por Jack 27.08.2017 / 11:03

1 resposta

3

Algo como isso talvez?

find . -type d -name data \
    \! -exec test -f {}/Archive.zip ';' \
    -execdir zip -rj data/Archive.zip data ';'

Isto localizaria cada diretório data (primeira linha).

O \! -exec test -f {}/Archive.zip ';' filtraria qualquer diretório data que não contenha nenhum arquivo chamado Archive.zip .

Esta linha pode ser substituída por \! -execdir test -f data/Archive.zip ';' .

O último -execdir executaria o comando zip fornecido dentro do diretório pai do diretório data . Isso criaria data/Archive.zip contendo os arquivos em data (sem nenhum caminho anexado aos nomes de arquivos arquivados).

Isso é semelhante a minha resposta à sua pergunta anterior , mas com o teste da existência de data/Archive.zip inserido.

    
por 27.08.2017 / 11:15