localizar e compactar várias extensões de arquivo, mantendo a estrutura de pastas

1

Ubuntu 16.04

Eu gostaria de fazer backup de todos os arquivos .txt, .cfg e .ini, mantendo a estrutura de pastas em um arquivo zip na pasta de backups.

Eu sei que há uma maneira mais fácil de fazer toda essa operação, mas é isso que eu tenho.

#!/bin/bash

wdir="/home/files"
backup_dir="/home/files/backup"
allcfg=$(find suan -name '*.cfg')
alltxt=$(find suan -name '*.txt')
allini=$(find suan -name '*.ini')
timeStamp="$(date +%Y--%b-%d--%k:%M--%P)"
backupfilename="${backup_dir}/Backup-${timeStamp}.zip"

#-- set some arrays ...
backupfiles=( "$allcfg" "$alltxt" "$allini" )

cd "$wdir"
zip -r "$backupfilename" "$backupfiles"

Assim, posso ver uma boa saída dos arquivos que ele arquiva, mas quando chega na parte de compactação, ele comete erros.

zip error: Nothing to do! (try: zip -r /home/files/backup/Backup-2018--Jul-04--21:37--pm.zip . -i suan/cfg/360controller.cfg

Mas isso também não funciona.

    
por needtoknow 05.07.2018 / 03:45

2 respostas

2

É assim que funciona a opção -r recursiva em 7z , é uma pesquisa de padrões recursivos.

7z a -r "$backupfilename" \*.ini \*.cfg \*.txt

7z cria arquivos zip bem.

Você também pode fazer a opção multi-arg em find se de alguma forma você não tiver 7zip,

find suan \( -name \*.cfg -o -name \*.txt -o -name \*.ini \) \
    -exec zip -r "$backupfilename" {} +
    
por 05.07.2018 / 04:56
0

Usando find e zip :

find "$wdir" -type f '(' -name '*.cfg' -o -name '*.txt' -o -name '*.ini' ')' \
    -exec zip -r "$backupfilename" {} +

Como alternativa, você pode deixar seu script cd em "$wdir" primeiro e, em seguida, usar . no comando find , dependendo do caminho que gostaria de salvar no arquivo.

Isso localizaria todos os arquivos relevantes e arquivaria-os em seu arquivo de backup.

Como alternativa, com bash , se não houver milhares de arquivos:

set -s globstar nullglob dotglob
cd "$wdir" && zip -r "$backupfilename" **/*.ini **/*.cfg **/*.txt

As opções de shell configuradas aqui ativam o ** glob (que globs pathnames), faz globs não expandidos expandirem para a string vazia e faz com que globs correspondam a arquivos ocultos.

    
por 13.07.2018 / 11:47

Tags