: tw + pax for backup
command=bax
customize=../lib/${command}/init
root= arch_name= arch_keep= big_size= big_magic_keep=
name_skip= path_skip= reg_magic_skip= src_name= src_magic_skip=
ifs=${IFS-'
'}
IFS=:
path=$PATH
IFS=$ifs
for dir in $path
do if test -f $dir/$customize
then . $dir/$customize
break
fi
done
root=${root:-'/'}
arch_name=${arch_name:-'arch'}
arch_keep=${arch_keep:-'bin|fun|lib'}
big_size=${big_size:-5000000}
big_magic_keep=${big_magic_keep:-'mail'}
name_skip=${name_skip:-'?(*.)(old|save|tmp)?(.*)|.*-cache'}
path_skip=${path_skip:-'/dev|/usr/local/ast/ship'}
reg_magic_skip=${reg_magic_skip:-'core|cql * index|history|TeX dvi'}
src_name=${src_name:-'src'}
src_magic_skip=${src_magic_skip:-'executable|object|(archive|shared) library'}
case $# in
[01]) echo "Usage: $command delta base [dir ...]" >&2
exit 2
;;
esac
delta=$1
shift
base=$2
shift
case $# in
0) set $root ;;
esac
dirs=
while :
do case $# in
0) break ;;
esac
dirs="$dirs -d $1"
shift
done
tw $dirs -mH -e "
begin: int arch_bit = 1;
int src_bit = 2;
char* m;
sort: name;
select: if (name == '${name_skip}')
status = SKIP;
else if (type == REG)
{
m = magic;
if (size > ${big_size} && m != '*@(${big_magic_keep})*' ||
m == '*@(${reg_magic_skip})*' ||
(parent.local & src_bit) && m == '*@(${src_magic_skip})*')
status = SKIP;
}
else if (type == DIR)
{
local = (parent.local & src_bit);
if (dev != parent.dev || path == '${path_skip}' || (parent.parent.local & arch_bit) && name != '${arch_keep}')
status = SKIP;
else if (name == '${arch_name}')
local |= arch_bit;
else if (name == '${src_name}')
local |= src_bit;
}
return 1;
" | pax -o "write ordered physical verbose file=$delta base=$base"