Created
October 25, 2024 23:06
-
-
Save wellington1993/0d3bf62970e9d96970a6e02306d7c68d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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