Un script shell peut très bien faire le travail :
copier entre ---- DEBUT et ----- FIN dans un fichier par exemple darc.sh à mettre dans ~/bin, faire un chmod 755 ~/bin/darc.sh dans une fenêtre Terminal, et ensuite
~/bin/darc.sh Nom_du_dossier_à_sauvegarder
créera un Nom_du_dossier à sauvegarder.dmg.tgz, une image dmg du dossier compactée avec tar et gzip,
seule restriction pas d'espace dans le Nom_du_dossier_à_sauvegarder
(la restriction ne s'applique pas aux fichiers/dossiers inclus dans le dossier à sauvegarder)
le Nom_du_dossier_à_sauvegarder peut-être un fichier, il peut y avoir plusieurs noms... dans ce cas une archive par paramètre (voir aussi option -o)
différentes options
-r effacera le dmg intermédiaire
-R effacera le dmg ET l'original
-l listera le contenu du backup dans un .txt
-L listera le contenu du backup dans un .bom
(man mkbom)
-v travaille en mode "verbeux" (plus de message)
-o archive_file_name spécifie le nom e la dmg et si l'on pase plusieurs paramètres, ils seront TOUS dans cette archive unique
-h donne les explications (en anglais)
comme quoi en lisant les pages man on peut faire beaucoup de choses : man ditto mkbom lsbom hdiutil hdid grep awk sh test
Eviter quand même de faire un sudo darc.sh -R sur /bin ....
----------- DEBUT ----------------
#! /bin/sh
# (c) P3 Consulting, 2002
# All rights Reserved
# LICENSE: GPL
# TODO
# 1. support of file names containing spaces
# 2. more testing to be better bullet proof
# 3. option -b to directly burn the archive
# 4. your suggestions mailto:
[email protected]
function echo_help
{
echo "Usage darc [-h|f|r|R|o archivefilename] file(s)..."
echo "-f to force if .dmg already exists"
echo "-r to remove temporaries"
echo "-R to remove temporaries AND original"
echo "-o archivefilename to output to one archive file"
echo "-h display this message"
echo "-v verbose mode"
echo "-l list saved files in a $arg.txt file (using ls -lR)"
echo "-L list saved files in a $arg.bom file (using mkbom) "
echo "(c) P3 Consulting
[email protected], GPL License"
}
args=`getopt lLvhfrRo: $*`
if test $# = 0
then
echo_help
exit 2
fi
set -- $args
for i in $*
do
case "$i"
in
-f)
force=$i; shift;;
-r|-R)
remove=$i; shift;;
-h)
help=$i; shift;;
-o)
only1=$i; oarg=$2; shift; shift;;
-v)
verbose=$i; shift;;
-l)
list=$i; shift;;
-L)
bom=$i; shift;;
--)
shift; break;;
esac
done
if test "$help" = "-h"
then
echo_help
exit 0
fi
if test "$only1" = "-o"
then
# we have to calculate the sum of all files
# we increase by 15% to take into account hfs formatting overhead, anyway gzip will compact unused space to almost 0
# maybe 10% would be enough
sum=`du -s $* | awk 'BEGIN{ s=0 }{ s +=$1 } END{ print s}' | awk '{ print $1*1.15 }' | awk 'BEGIN{ FS ="." } {print $1}'`
# min 5mb for hfs dmg's
if test $sum -lt 10240
then
sum=10240
fi
if test -e "$oarg"".dmg"
then
if test "$force" = "-f"
then
if test "$verbose" = "-v"
then
echo "old image already exist: deleting..."
fi
rm "$oarg"".dmg"
else
if test "$verbose" = "-v"
then
echo "old image already exist: aborting (use -f argument to force)..."
fi
exit 1
fi
fi
dmg="$oarg"".dmg"
if test "$verbose" = "-v"
then
echo "creating disk image " $dmg
fi
hdiutil create $dmg -ov -sectors $sum
hdid -nomount "$oarg"".dmg" | awk '{print NR"\t"$1}' > /tmp/darc.tmp
dev=`cat /tmp/darc.tmp | grep ^3 | awk '{print $2}' | awk 'BEGIN {FS="/"}{print $3}'`
disk=`cat /tmp/darc.tmp | grep ^1 | awk '{print $2}' | awk 'BEGIN {FS="/"}{print $3}'`
echo ""
if test "$verbose" = "-v"
then
echo "creating file system on device " $dmg
fi
newfs_hfs -v $oarg "/dev/r"$dev
hdiutil eject $disk
hdid $dmg
if test "$verbose" = "-v"
then
echo "backing up files on " $dmg
fi
for i in $*
do
if test -e "$i"
then
arg=`echo $i | awk 'BEGIN { FS = "/" } { print $1 }'`
if test -d $i
then
dir="$i"
mkdir "/Volumes/$oarg/$dir"
else
dir= ""
fi
if test "$verbose" = "-v"
then
echo "ditto -rsrcFork $arg /Volumes/$oarg/$dir"
fi
if ! ditto -rsrcFork $arg /Volumes/$oarg/$dir
then
if test "$verbose" = "-v"
then
echo "error during backup : aborting..."
fi
hdiutil eject $disk
exit 1
fi
else
if test "$verbose" = "-v"
then
echo "Warning " $i " not found !"
fi
fi
if test "$list" = "-l"
then
ls -lR "/Volumes/$oarg/$arg" > "$oarg.txt"
fi
if test "$bom" = "-L"
then
mkbom "/Volumes/$oarg/$arg" "$arg.bom"
fi
done
hdiutil eject $disk
if test "$verbose" = "-v"
then
echo "tar-ing disk image..."
fi
if ! tar -czf "$oarg.dmg.tgz" "$oarg.dmg"
then
if test "$verbose" = "-v"
then
echo "error during tar-ing : aborting..."
fi
exit 1
fi
if test ("$remove" = "-R") -o ("$remove" = "-r")
then
if test "$verbose" = "-v"
then
echo "removing temporary... $oarg.dmg"
fi
rm "$oarg.dmg"
if test "$remove" = "-R"
then
if test "$verbose" = "-v"
then
echo "removing originals..."
fi
for i in $*
do
if test -e "$i"
then
arg=`echo $i | awk 'BEGIN { FS = "/" } { print $1 }'`
if test -d "$arg"
then
rm -R "$arg"
else
rm "$arg"
fi
fi
done
fi
fi
else
for i in $*
do
if test -e "$i"
then
arg=`echo $i | awk 'BEGIN { FS = "/" } { print $1 }'`
# we increase by 15% to take into account hfs formatting overhead, anyway gzip will compact unused space to almost 0
# maybe 10% would be enough
sum=`du -s $arg | awk '{ print $1*1.15 }' | awk 'BEGIN{ FS ="." } { print $1}'`
# min 5mb for hfs dmg's
if test $sum -lt 10240
then
sum=10240
fi
if test -e "$arg"".dmg"
then
if test "$force" = "-f"
then
if test "$verbose" = "-v"
then
echo "old image already exist: deleting..."
fi
rm "$arg"".dmg"
else
if test "$verbose" = "-v"
then
echo "old image already exist: aborting (use -f argument to force)..."
fi
exit 1
fi
fi
dmg="$arg"".dmg"
if test "$verbose" = "-v"
then
echo "creating disk image " $dmg
fi
hdiutil create $dmg -ov -sectors $sum
hdid -nomount "$arg"".dmg" | awk '{print NR"\t"$1}' > /tmp/darc.tmp
dev=`cat /tmp/darc.tmp | grep ^3 | awk '{print $2}' | awk 'BEGIN {FS="/"}{print $3}'`
disk=`cat /tmp/darc.tmp | grep ^1 | awk '{print $2}' | awk 'BEGIN {FS="/"}{print $3}'`
echo ""
if test "$verbose" = "-v"
then
echo "creating file system on device " $dmg
fi
newfs_hfs -v $arg "/dev/r"$dev
hdiutil eject $disk
hdid $dmg
if test "$verbose" = "-v"
then
echo "backing up files on " $dmg
fi
if ! ditto -rsrcFork $arg /Volumes/$arg
then
if test "$verbose" = "-v"
then
echo "error during backup : aborting..."
fi
hdiutil eject $disk
exit 1
fi
if test "$list" = "-l"
then
ls -lR /Volumes/$arg/ > "$arg.txt"
fi
if test "$bom" = "-L"
then
mkbom /Volumes/$arg/ "$arg.bom"
fi
hdiutil eject $disk
echo "tar-ing disk image..."
if ! tar -czf "$arg.dmg.tgz" "$arg.dmg"
then
if test "$verbose" = "-v"
then
echo "error during tar-ing : aborting..."
fi
exit 1
fi
if test ("$remove" = "-R") -o ("$remove" = "-r")
then
if test "$verbose" = "-v"
then
echo "removing temporaries..."
fi
rm "$arg.dmg"
if test ("$remove" = "-R")
then
if test "$verbose" = "-v"
then
echo "removing original..."
fi
if test -d "$arg"
then
rm -R "$arg"
else
rm "$arg"
fi
fi
fi
else
if test "$verbose" = "-v"
then
echo $i " not found !"
fi
fi
done
fi
------------ FIN ----------------