Como faço para tarar arquivos de pontos, mas não para diretórios de pontos

1

O seguinte comando tar excluirá todos os arquivos de pontos e diretórios de pontos.

tar -cvzf /media/bjackfly/bkup/bkup.gz --exclude '.*' --one-file-system /home/bjackfly

No meu caso, eu quero fazer o backup dos arquivos de ponto no diretório inicial ( .vimrc , .bashrc ) etc., mas não nos diretórios de pontos /.config /.cache /.eclipse etc.

Qualquer guru do Linux com um comando para isso, ou eu preciso executar um achado em um tar ou fazer dois comandos tar diferentes que não sejam ideais? Um para arquivos de ponto no diretório inicial e outro para todo o resto?

    
por bjackfly 22.08.2013 / 08:09

6 respostas

2

Para zipar arquivos de ponto no diretório inicial:

$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +

Se você deseja incluir diretórios:

$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +

O ? é opcional no primeiro comando, mas não no segundo, caso contrário, find incluirá o diretório '.' .

(inspiração tirada de aqui .

    
por 17.10.2013 / 02:39
1

Eu não sei como fazer isso de uma só vez, mas você pode executar o comando e criar um arquivo tar e usar o comando find para anexar os ausentes. diretórios.

Algo como $ find -type d -regex '\..+' -exec tar -r {} /media/bjackfly/bkup/bkup.gz \;

Eu não testei este comando como estou sentado em uma máquina Windows e não tem acesso a um shell, mas você deve ser capaz de fazer isso usando este comando ou uma variação dele. Não tenho certeza se esse comando selecionará os diretórios . e .. para.

Felicidades.

    
por 22.08.2013 / 08:20
1

Usando os operadores lógicos -and e -or para selecionar todos os arquivos e diretórios que não começam com '.':

tar -cvzf /media/bjackfly/bkup/bkup.gz --one-file-system $(find /home/bjackfly -type f -or -type d -and -not -name '.*' )

Editar slhck comentou que a solução acima não lida com nomes de arquivos contendo espaço em branco. Esta é uma solução, talvez alguém conheça uma técnica mais elegante?

find . -type f -or -type d -and -not -name '.*' >/tmp/tar.$$
tar -cvzf /media/bjackfly/bkup/bkup.gz --one-file-system /home/bjackfly -T /tmp/tar.$$
rm /tmp/tar.$$
    
por 22.08.2013 / 09:00
0

então o verdadeiro truque aqui é criar um arquivo .tar regular e então usar um "find piped" em outro tar usando a opção -u para adicionar ou atualizar o .tar e depois zí-lo depois. Graças a Mogget, que teve a idéia básica.

#!/bin/bash
BKUPDIR="/media/bjackfly/backupDisk/bkup"
BKUPFILE=$(/bin/date +"%Y%m%d").bkup
SRCDIR=/home/bjackfly


tar -cvf "$BKUPDIR/${BKUPFILE}.tar" --exclude '.*'  --one-file-system "$SRCDIR"
find $SRCDIR -maxdepth 1 -mindepth 1 -type f -name '.*'  ! \( -name .Xauthority.* \) | tar -uvf "$BKUPDIR/$BKUPFILE.tar" -T -
gzip "$BKUPDIR/$BKUPFILE.tar"
    
por 23.08.2013 / 02:43
0

Não, não é isso. Se você quiser fazer backup de todos os arquivos na estrutura de diretórios simples sem recursão, use:

tar cvf backupfile.tar -C /specify/dir --no-recursion '.*'

infelizmente, esse backup de arquivos pontilhados com diretórios pontilhados. A boa notícia é que o conteúdo do diretório não será armazenado em backup.

Caso contrário, se os nomes dos arquivos não tiverem novos caracteres de linha, você poderá usar:

cd /some/dir
find ./ -minlevel 1 -maxlevel 1 -type f -name '.*'|tar cvf backupfile.tar -T - --no-recursion

procure a opção -T. com argumento '-' esta lista de arquivos do seu stdin. lista é gerada pelo comando find. Essa abordagem é mais melhor porque você não está limitado pelo comprimento do comando maxumum, como exemplos dados por outros, por exemplo, tar .... algo $ (find) ou find ... | xargs ... tar ..alguma coisa ... {} que coloca lista de arquivos completa como argumentos de comando tar. isso pode ultrapassar o limite de tamanho de comando.

opção --no-recursão é neste caso apenas para segurança. essa causa, quando o tar pega algum diretório, o tar não vai para essa estrutura de diretórios. é muito útil em conjunto com o find.

Nesta abordagem, você pode executar (como seco, sem fazer backup) o comando find e você verá quais arquivos são necessários.

    
por 05.09.2013 / 10:37
0

1.
find ./target-dir -type d -name '.?*' -prune -o -print0 | tar --null --no-recursion -cvzf backup.tar.gz -T -

OR

2.
find ./target-dir -type d -name '.?*' -prune -o -print0 -exec tar --null --no-recursion -cvzf backup.tar.gz -T {} +

    
por 21.01.2014 / 16:57

Tags