Crie arquivos zip com tamanho determinado

2

A minha pergunta é a mesma que em Create vários arquivos zip que não são dependentes uns dos outros? mas minha idéia é adicionar arquivos ao zip até que ele seja do tamanho necessário e continuar com um novo arquivo zip para os outros e assim por diante.

Alguma ideia de como fazer isso em um script bas? O script aqui, link parece ser de muita ajuda. Precisa de algumas personalizações.

    
por Jimson Kannanthara James 04.07.2013 / 14:37

2 respostas

3

Um script básico apenas verifica o tamanho do arquivo zip e troca os arquivos zip de acordo. Algo parecido com isto:


#!/usr/bin/env bash

## This counter is used to change the zip file name
COUNTER=0;
## The maximum size allowed for the zip file
MAXSIZE=1024;
## The first zip file name
ZIPFILE=myzip"$COUNTER".zip;
## Exit if the zip file exists already
if [ -f $ZIPFILE ]; then
    echo $ZIPFILE exists, exiting...
    exit;
fi
## This will hold the zip file's size, initialize to 0
SIZE=0;

## Go through each of the arguments given in the command line
for var in "$@"; do
    ## If the zip file's current size is greater than or
    ## equal to $MAXSIZE, move to the next zip file
    if [[ $SIZE -ge $MAXSIZE ]]; then
    let COUNTER++;
    ZIPFILE=myzip"$COUNTER".zip;
    fi
    ## Add file to the appropriate zip file
    zip -q $ZIPFILE $var;
    ## update the $SIZE
    SIZE='stat -c '%s' $ZIPFILE';
done

CAVEATS:

  • O script espera arquivos , não os diretórios, se você quiser que ele seja executado nos diretórios, adicione -r ao comando zip . No entanto, ele não verificará o tamanho do arquivo até que o diretório each seja compactado.
  • O tamanho do arquivo zip é verificado após cada compactação. Isso significa que você obterá arquivos maiores que seu limite. Isto porque é difícil adivinhar qual será o tamanho comprimido de um ficheiro, por isso não posso verificar antes de o adicionar ao arquivo.
por 04.07.2013 / 15:14
0

EDIT: Alguma idéia sobre como otimizar o script abaixo para contagens de arquivos enormes ??

#!/usr/bin/env bash

format="%b-%m.zip"    # the default format
# see http://unixhelp.ed.ac.uk/CGI/man-cgi?date
dateformat="%Y-%b-%d" # the default date format
zipsize=2048; #256901120 #245MB
zipfile="" # the zip file name to use.

if [[ $# -lt 1 ]]; then
  echo "Usage: $0 directory [format] [zip size] [dateformat]"
  echo
  echo "Where format can include the following variables:"
  echo " %f file"
  echo " %b file with no extention"
  echo " %e file extention"
  echo " %c file created date (may be 1-Jan-1970 UTC if unknown)"
  echo " %m file modified date"
  echo " %t current date"
  echo
  echo "And dateformat uses the same format specifiers as the date command."
  echo
  echo " Example: $0 zip-1 %f-%m.zip %Y"
  echo " Example: $0 zip-1 %f-%m.zip %Y-%b"
  echo
  echo "And zipsize is the maximum zip size allowed per zip file in bytes."
  echo
  echo " Example: $0 zip-1 256901120 %f-%m.zip %Y"
  echo " Example: $0 zip-1 256901120 %f-%m.zip %Y-%b"
  exit 1
fi

if [[ $# -ge 2 ]]; then
  zipsize="$2"
fi

if [[ $# -ge 3 ]]; then
  format="$3"
fi

if [[ $# -ge 4 ]]; then
  dateformat="$4"
fi


dozip()
{
  filepath=$1
  parent_path=$(dirname "$filepath")
  file=$(basename "$filepath")
  ext=${file##*.}
  body=${file%.*}

  date=$(date +$dateformat)
  mdate=$(date --date="@$(stat -c %Y "$filepath")" +$dateformat)
  cdate=$(date --date="@$(stat -c %W "$filepath")" +$dateformat)

    if [ -z "$zipfile" ]; then
    zipfile=$(echo $format | sed -e "s/%f/$file/g" -e "s/%b/$body/g" -e "s/%e/$ext/g" -e "s/%t/$date/g" -e "s/%m/$mdate/g" -e "s/%c/$cdate/g")
    else
    size='stat -c '%s' $zipfile'
    if [[ $size -ge $zipsize ]]; then
      zipfile=$(echo $format | sed -e "s/%f/$file/g" -e "s/%b/$body/g" -e "s/%e/$ext/g" -e "s/%t/$date/g" -e "s/%m/$mdate/g" -e "s/%c/$cdate/g")
    fi
    fi

  pushd "$parent_path" > /dev/null
  zip "$zipfile" "$file" > /dev/null
  popd > /dev/null
}

#files=$(find $1 -type f)
files=$(find $1 -type f | sed -e '/zip$/d') # exclude zip files
IFS=$'\n';
for file in $files; do
  dozip $file
done
    
por 04.07.2013 / 16:47

Tags