Skip to content

Instantly share code, notes, and snippets.

@wellington1993
Created October 25, 2024 23:06
Show Gist options
  • Save wellington1993/0d3bf62970e9d96970a6e02306d7c68d to your computer and use it in GitHub Desktop.
Save wellington1993/0d3bf62970e9d96970a6e02306d7c68d to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
# Configurações personalizáveis
BASE_DIRS=("/DATA/LAUDOS" "/DATA/LAUDOS_ANTIGOS")
FILES_PER_DIR=100
COMPRESSION_LEVEL=9
OUTPUT_FORMAT="zip"
DELETE_ORIGINAL=true
LOG_FILE="compression_log.txt"
# Limpar o arquivo de log a cada execução
> $LOG_FILE
# Verificar se o comando '7zr' está disponível
if ! command -v 7zr &> /dev/null; then
echo "O comando '7zr' não está disponível. Mostrando os comandos que seriam executados:"
ZIP_AVAILABLE=false
else
ZIP_AVAILABLE=true
ZIP_CMD="7zr a -t7z -mx$COMPRESSION_LEVEL"
TEST_CMD="7zr t"
fi
# Função para registrar mensagens no log
log() {
echo "$(date +"%Y-%m-%d %H:%M:%S") - $1" >> $LOG_FILE
}
# Função para remover barras duplicadas dos caminhos
clean_path() {
local path="$1"
echo "$path" | sed 's/\/\//\//g'
}
# Função para processar pastas de clientes
process_client_directory() {
local client_dir="$1"
for subdir in "original" "processado"; do
log "Processando subdiretório: $client_dir/$subdir"
if [[ -d "$client_dir/$subdir" ]]; then
count=0
for pdf in "$client_dir/$subdir"/*.pdf; do
if [[ -f "$pdf" ]]; then
local pdf_clean
pdf_clean=$(clean_path "$pdf")
local zip_command="$ZIP_CMD \"${pdf_clean%.pdf}.zip\" \"$pdf_clean\" > /dev/null"
if $ZIP_AVAILABLE; then
zip_output=$(bash -c "$zip_command" 2>&1)
if [ $? -eq 0 ]; then
$TEST_CMD "${pdf_clean%.pdf}.zip" > /dev/null
if [ $? -eq 0 ]; then
log "Arquivo ZIP gerado com sucesso: ${pdf_clean%.pdf}.zip"
touch -r "$pdf_clean" "${pdf_clean%.pdf}.zip"
if [[ "$DELETE_ORIGINAL" = true ]]; then
rm "$pdf_clean"
fi
else
log "Erro ao testar o arquivo $pdf_clean"
fi
else
log "Erro ao comprimir $pdf_clean: $zip_output"
fi
else
echo "Comprimir: $zip_command && rm \"$pdf_clean\"" | tee -a $LOG_FILE
fi
((count++))
if [[ "$count" -ge "$FILES_PER_DIR" ]]; then
break
fi
fi
done
else
log "Subdiretório não encontrado: $client_dir/$subdir"
fi
done
}
# Função para processar diretório base com limite de processos
process_directory() {
local base_dir="$1"
local max_procs=4 # Limite de processos simultâneos
log "Processando diretório base: $base_dir com limite de $max_procs processos simultâneos"
local current_procs=0
for client_dir in "$base_dir"/*; do
if [[ -d "$client_dir" ]]; then
process_client_directory "$client_dir" &
((current_procs++))
if [[ $current_procs -ge $max_procs ]]; then
wait -n # Espera por qualquer processo terminar
((current_procs--))
fi
fi
done
wait # Espera todos os processos restantes terminarem
}
# Iterar sobre os diretórios base
for base_dir in "${BASE_DIRS[@]}"; do
if [[ -d "$base_dir" ]]; then
process_directory "$base_dir"
else
log "O diretório '$base_dir' não existe."
fi
done
# Relatório final
echo "Relatório Final" >> $LOG_FILE
echo "=================" >> $LOG_FILE
cat $LOG_FILE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment