Arquivo Gzip, mas excluindo alguns arquivos de diretórios | e também acrescenta a data atual

0

Estou procurando uma maneira de criar um arquivo .tar.gz de um diretório, mas tenho algumas dúvidas. Eu sei que o comando para criar o arquivo é:

tar -zcvf /path/to/compressed/file.tar.gz /path/to/compress 

E então eu vou conseguir um file.tar.gz , mas isso mantém o caminho para as fontes originais. Então é isso que estou procurando:

  • Deve ser compactado como .tar.gz
  • Se for possível não deve manter o caminho para o diretório compactado Quer dizer, eu só preciso do diretório de compactação e seu conteúdo.Se eu descompactar o arquivo no Windows, por exemplo, eu vou receber /path[folder]/to[folder]/compress[folder+content] e eu só quero o mais recente
  • Se for possível, posso omitir alguns diretórios? Exemplo eu gosto de compactar a pasta app/ e seu conteúdo é:

    drwxrwxr-x  6 ubuntu ubuntu  4096 Feb 24 14:48 ./
    drwxr-xr-x 10 ubuntu ubuntu  4096 Feb 26 22:33 ../
    -rw-rw-r--  1 ubuntu ubuntu   141 Jan 29 06:07 AppCache.php
    -rw-rw-r--  1 ubuntu ubuntu  2040 Feb 24 14:48 AppKernel.php
    -rw-rw-r--  1 ubuntu ubuntu   267 Jan 29 06:07 autoload.php
    -rw-r--r--  1 root   root   94101 Feb 19 21:09 bootstrap.php.cache
    drwxrwxrwx  4 ubuntu ubuntu  4096 Feb 25 16:44 cache/
    -rw-rw-r--  1 ubuntu ubuntu  3958 Feb 24 14:48 check.php
    drwxrwxr-x  2 ubuntu ubuntu  4096 Feb 24 14:48 config/
    -rwxrwxr-x  1 ubuntu ubuntu   867 Jan 29 06:07 console*
    -rw-rw-r--  1 ubuntu ubuntu  6148 Jan 29 06:07 .DS_Store
    -rw-rw-r--  1 ubuntu ubuntu   143 Jan 29 06:07 .htaccess
    drwxrwxrwx  2 ubuntu ubuntu  4096 Feb 24 14:48 logs/
    -rw-rw-r--  1 ubuntu ubuntu  1118 Jan 29 06:07 phpunit.xml.dist
    drwxrwxr-x  5 ubuntu ubuntu  4096 Jan 29 06:07 Resources/
    -rw-rw-r--  1 ubuntu ubuntu 30404 Feb 24 14:48 SymfonyRequirements.php
    

    Mas eu quero deixar de fora cache/ , logs/ diretórios e bootstrap.php.cache arquivo, como? Isso é possível?

  • Eu preciso acrescentar a data atual (DD / MM / AAAA-H: M: S) ao nome do arquivo, como?

Posso obter algum conselho ou ajuda sobre isso? Estou planejando adicionar isso a um script Bash para que ele funcione como um script bash e não como uma linha de comando

Atualização: teste dentro do script

Seguindo sugestão @Ariel , adicionei esta linha a um script bash:

read -e -p "Enter the directory to compress: " -i "/var/www/html/" directory
read -e -p "Enter the filename: " filename
FILENAME = "$filename-'date +%d-%m-%Y-%X'.tgz"

cd "$directory"
tar -zcvf /home/$FILENAME --exclude cache --exclude logs --exclude bootstrap.php.cache --exclude composer.lock --exclude vendor

Mas estou recebendo este erro:

Enter the directory to compress: /var/www/html/lynxoft/apps/checkengine/
Enter the filename: checkengine
/usr/local/bin/script-task: line 109: FILENAME: command not found
tar: Cowardly refusing to create an empty archive

Por que FILENAME é tratado como um comando e não como var como docs diz?

Atualização 2: ainda compactando todo o caminho

Eu consertei alguns problemas graças aos comentários dos usuários e as linhas no script se parecem com isso:

read -e -p "Enter the directory to compress: " -i "/var/www/html/" directory
read -e -p "Enter the filename: " filename
FILENAME="$filename"-$(date +%d-%m-%Y-%T).tgz

cd "$directory/.."
tar -zcvf /home/$FILENAME "$directory" --exclude="*cache*" --exclude=logs --exclude=bootstrap.php.cache --exclude=composer.lock --exclude=vendor --exclude=.git

O único problema remanescente é que o arquivo compactado ainda tem o caminho completo e não apenas o diretório final. Por exemplo:

Enter the directory to compress: /var/www/html/lynxoft/apps/checkengine/
Enter the filename: file

Isso resulta em file-28-02-2015-17:44:32.tgz , mas o conteúdo dentro do arquivo compactado ainda tem o caminho inteiro /var/www/html/lynxoft/apps/checkengine/ , por quê?

    
por ReynierPM 01.03.2015 / 18:31

2 respostas

2

Apenas cd para a pasta de onde deseja que a estrutura de tarball seja iniciada e use caminhos relativos! Então, por exemplo:

# Note, one folder above
cd /path/to/compress/..
# Tell tar to compress the relative path    
tar -zcvf /path/to/compressed/file.tar.gz compress

Quando você descompactá-lo, ele criará a pasta compress no diretório de trabalho atual.

Você pode excluir arquivos ou pastas usando a opção --exclude <PATTERN> e adicionar uma data no nome do arquivo com date +FORMAT , por exemplo:

FILENAME="file-'date +%d-%m-%Y-%T'.tgz"
tar -zcvf /path/to/compressed/$FILENAME --exclude cache --exclude logs --exclude bootstrap.php.cache compress
    
por 01.03.2015 / 19:56
1

Com gnu tar você pode usar:

--transform=EXPRESSION, --xform=EXPRESSION
      Use sed replace EXPRESSION to transform file names.

, o que significa que --xform='s|path/to/||' removerá path/to/ do caminho; e

--exclude=PATTERN
      Exclude files matching PATTERN, a glob(3)-style wildcard pattern.

para que você possa executar:

tar -zcvf /path/to/compressed/"$(date +%d-%m-%Y-%T)"-testdir.tar.gz \
--transform='s|^path/to/||' /path/to/compress \
--exclude='cache' --exclude='logs' --exclude='bootstrap.php.cache'

Não há nenhum líder / na expressão usada com xform . Uma abordagem mais genérica:

--xform='s|^([^/]*/){2}||x'

Isso tira os dois primeiros elementos do caminho (substitua 2 por outro número - conforme necessário).

    
por 02.03.2015 / 02:31