Alguma solução alternativa para arquivos zip de pipe? [duplicado]

2

Eu uso o Ubuntu 16.04 com Nginx e Bash. Eu sei que não é possível direcionar diretamente os dados do canal para zip .

Por exemplo, se você hospedar sites no servidor da Web Apache / Nginx, esse conjunto de comandos falhará após o preenchimento da senha:

drt="/var/www/html"
mysqldump -u root -p --all-databases | zip "$drt/db-$date.zip"

Qual será sua solução alternativa se você realmente deseja que o arquivo final seja um arquivo zip?

    
por user9303970 10.04.2018 / 21:33

3 respostas

4

Se você realmente quiser usar zip , use o truque de Jeff Schaller :

drt="/var/www/html"
mysqldump -u root -p --all-databases | zip "$drt/db-$date.zip" -

Isso criará um arquivo ZIP contendo um arquivo chamado - cujo conteúdo é o dump do banco de dados. Isso é mencionado na% man_de% manpage:

zip also accepts a single dash ("-") as the name of a file to be compressed, in which case it will read the file from standard input, allowing zip to take input from another program. For example:

tar cf - . | zip backup -

Você também pode usar zip :

mysqldump -u root -p --all-databases | zip -FI "$drt/db-$date.zip" /dev/stdin

Isso resultaria em um arquivo contendo um arquivo chamado /dev/stdin , que pode ser mais difícil de manipular corretamente. dev/stdin é um atalho comum para dizer aos programas para usar entrada ou saída padrão; não é algo que o shell manipule, ele precisa ser suportado por cada programa individual.

Em ambos os casos, você provavelmente desejaria usar - para extrair os dados. ele extrai o primeiro membro de um arquivo para sua saída padrão.

    
por 10.04.2018 / 22:27
8

Se você estiver aberto a ferramentas de compactação alternativas, tente esta alternativa quase idêntica.

drt="/var/www/html"
mysqldump -u root -p --all-databases | gzip >"$drt/db-$date.gz"

Se preferir, você pode substituir gzip por bzip2 ou xz e a extensão típica de gz a bz2 ou xz .

    
por 10.04.2018 / 22:04
3

Se você realmente prefere um arquivo zip usando gzip ou tar :

drt="/var/www/html"
scratch="$(mktemp)"
if mysqldump -u root -p --all-databases > "$scratch"; then
  zip "$drt/db-$date.zip" "$scratch"
fi
rm -f  "$scratch"

Opcionalmente, você pode usar um diretório temporário para ter um nome de arquivo mais útil:

drt="/var/www/html"
scratchdir="$(mktemp -d)"
if mysqldump -u root -p --all-databases > "${scratchdir}/db-${date}.sql"; then
  zip -j "$drt/db-$date.zip" "${scratchdir}/db-${date}.sql"
fi
rm -rf "$scratchdir"
    
por 10.04.2018 / 22:13