Utente:Iron Bishop/splitmbox

Per quanto io abbia cercato in lungo e in largo, non son riuscito a trovare script per splittare un file mbox in base alla grandezza dei frammenti risultanti. Questo è piuttosto grezzo, ma per me è sufficiente.

Partendo da come splittare un file mbox in tanti file quanti sono i messaggi

cat $FI | formail -s sh -c 'cat > /tmp/mbox_$FILENO'

ho aggiunto la parte relativa al riassemblaggio dei file rimanendo più o meno nel limite di byte prefissato.

#!/bin/bash
#
# Splitta un file mbox in un file per ogni messaggio,
# poi li rimette insieme senza superare un limite (da
# esprimere in kilobyte).
#
# Creato da Iron Bishop il 17.08.2006 - pubblico dominio
#
FI=$1
SIZEL=$(( $2 + 0 ))
i=0
j=0
fn=/tmp/mbox_000

if [[! -e $FI || ! $SIZEL]] ; then
 echo "Usage: $0 filename sizelimit"
 exit 1
fi

if [[-e $FI$i]] ; then
 echo "Interrotto: il file $FI$i esiste!"
 exit 2
fi

echo "File da splittare: $FI"
echo "Limite di spazio: $SIZEL"

cat $FI | formail -s sh -c 'cat > /tmp/mbox_$FILENO'

echo "Messaggi trovati: `ls -1 /tmp/mbox_* | wc -l`"

while [ -e $fn ] ; do

 cat $fn >> $FI$i
 if [ `du -k $FI$i | cut -f1` -gt $SIZEL ] ; then
  i=$(( $i + 1 ))
 fi

 j=$(( $j + 1 ))
 if [ $j -lt 10 ] ; then
  fn=/tmp/mbox_00$j
 elif [ $j -lt 100 ] ; then
  fn=/tmp/mbox_0$j
 else
  fn=/tmp/mbox_$j
 fi

done

echo -e "(debug: i=$i, j=$j, fn=$fn)"

rm -f /tmp/mbox_*

j=0
while [ $j -le $i ] ; do
 echo -e "x\n" | mail -f $FI$j | grep "var/mail"
 j=$(( $j + 1 ))
done
 

en: this explain how to split a mbox mail file in multiple files of (more or less) the size required