Faça backup de todo o conteúdo do diretório atual para um subdiretório dentro do diretório atual, que será criado se não existir

1

Eu preciso exatamente como perguntei no título da pergunta.

Agora eu tenho o seguinte comando para copiar todo o conteúdo do diretório atual para o subdiretório, desde que o subdiretório seja criado antecipadamente:

cp -p !($PWD/bakfiles2) bakfiles2/

Mas eu tenho que algumas vezes visitar essas pastas que eu nunca visitei antes, então subdiretório "bakfiles2" pode não existir lá, posso de alguma forma criar esse diretório de backup com timestamp atual (como evitar conflitos com qualquer diretório existente ), em tempo real, com o comando single copy ou o script bash?

Seria ótimo se o script pudesse ignorar qualquer subdiretório começando com um padrão específico que poderia ser reservado para backup nomes de diretório como _bak_* ( Nota: * significa qualquer número de quaisquer caracteres).

    
por VST 28.07.2017 / 09:22

2 respostas

0
O comando

cp não tem uma opção para criar o diretório de destino se ele não existir durante o enfrentamento, mas você pode conseguir com o script.

ou simplesmente use o comando rsync , que pode criar um diretório de destino se não existir apenas no último nível.

rsync -rv --exclude='_bak_*/' /path/in/source/ /path/to/destination
  • observe que levar o / em /path/in/source/ impedirá o próprio diretório de origem de cópia e a inclusão da opção --exclude não sincronizará os diretórios com o nome correspondente.
por 28.07.2017 / 09:41
0

Você pode obter um timestamp atual com o comando date

date +'%Y%m%d_%H%M%S'

Você pode copiar o conteúdo de um diretório apenas para um diretório que já exista, a menos que esteja usando uma cópia recursiva. No entanto, você não pode usar uma cópia recursiva, a menos que queira que os diretórios de backup anteriores também sejam copiados para o novo diretório de backup.

Então, isso precisa ser feito em algumas etapas

backup_dir="_bak_$(date +'%Y%m%d_%H%M%S')"
mkdir "$backup_dir"
cp -p !(_bak_*) "$backup_dir/"

Lembre-se de que, conforme escrito, isso não copiará os arquivos de ponto (arquivos iniciados com um caractere . ), pois eles geralmente são tratados especialmente pelo shell. (Você pode querer considerar nomear seu diretório de backup .bak_* em vez de _bak_* para se beneficiar deste recurso. Você pode então cp -p * "$backup_dir/" )

Não há motivo para que isso não tenha sido criado como uma pequena função ou script, então ainda é apenas um comando.

    
por 28.07.2017 / 11:57