|
Packit Service |
1d0348 |
#!/bin/sh
|
|
Packit Service |
1d0348 |
# tar comparison program
|
|
Packit Service |
1d0348 |
# 2007-10-25 Jan Psota
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
n=3 # number of repetitions
|
|
Packit Service |
1d0348 |
TAR="bsdtar gnutar star" # Tape archivers to compare
|
|
Packit Service |
1d0348 |
OPT=("" "--seek" "-no-fsync")
|
|
Packit Service |
1d0348 |
pax="--format=pax" # comment out for defaults
|
|
Packit Service |
1d0348 |
OPN=(create list extract compare) # operations
|
|
Packit Service |
1d0348 |
version="2007-10-25"
|
|
Packit Service |
1d0348 |
TIMEFORMAT=$'%R\t%U\t%S\t%P'
|
|
Packit Service |
1d0348 |
LC_ALL=C
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
test $# -ge 2 || {
|
|
Packit Service |
1d0348 |
echo -e "usage:\t$0 source_dir where_to_place_archive
|
|
Packit Service |
1d0348 |
[where_to_extract_it]
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
TCP, version $version
|
|
Packit Service |
1d0348 |
TCP stands for Tar Comparison Program here.
|
|
Packit Service |
1d0348 |
It currently compares: BSD tar (bsdtar), GNU tar (gnutar) and star in archive
|
|
Packit Service |
1d0348 |
creation, listing, extraction and archive-to-extracted comparison.
|
|
Packit Service |
1d0348 |
Tcp prints out best time of n=$n repetitions.
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
Tcp creates temporary archive named tcp.tar with $pax and some native
|
|
Packit Service |
1d0348 |
(--seek/-no-fsync) options and extracts it to [\$3]/tcptmp/.
|
|
Packit Service |
1d0348 |
If unset, third argument defaults to [\$2].
|
|
Packit Service |
1d0348 |
After normal exit tcp removes tarball and extracted files.
|
|
Packit Service |
1d0348 |
Tcp does not check filesystems destination directories are on for free space,
|
|
Packit Service |
1d0348 |
so make sure there is enough space (a bit more than source_dir uses) for both:
|
|
Packit Service |
1d0348 |
archive and extracted files.
|
|
Packit Service |
1d0348 |
Do not use white space in arguments.
|
|
Packit Service |
1d0348 |
Jan Psota, $version"
|
|
Packit Service |
1d0348 |
exit 0
|
|
Packit Service |
1d0348 |
}
|
|
Packit Service |
1d0348 |
src=$1
|
|
Packit Service |
1d0348 |
dst=$2/tcp.tar
|
|
Packit Service |
1d0348 |
dst_path=${3:-$2}/tcptmp
|
|
Packit Service |
1d0348 |
test -e $dst -o -e /tmp/tcp \
|
|
Packit Service |
1d0348 |
&& { echo "$dst or /tmp/tcp exists, exiting"; exit 1; }
|
|
Packit Service |
1d0348 |
mkdir $dst_path || exit 2
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
use_times ()
|
|
Packit Service |
1d0348 |
{
|
|
Packit Service |
1d0348 |
awk -F"\t" -vN=$n -vL="`du -k $dst`" -vOFS="\t" -vORS="" '
|
|
Packit Service |
1d0348 |
{ if (NF==4) { printf "\t%s\t%10.1d KB/s\n", $0, ($1+0>0 ?
|
|
Packit Service |
1d0348 |
(L+0)/($1+0) : 0) } }' \
|
|
Packit Service |
1d0348 |
/tmp/tcp | sort | head -1
|
|
Packit Service |
1d0348 |
> /tmp/tcp
|
|
Packit Service |
1d0348 |
}
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
test -d $src || { echo "'$src' is not a directory"; exit 3; }
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
# system information: type, release, memory, cpu(s), compiler and flags
|
|
Packit Service |
1d0348 |
echo -e "TCP, version $version\n"`uname -sr`" / "`head -1 /etc/*-release`
|
|
Packit Service |
1d0348 |
free -m | awk '/^Mem/ { printf "%dMB of memory, ", $2 }'
|
|
Packit Service |
1d0348 |
test -e /proc/cpuinfo \
|
|
Packit Service |
1d0348 |
&& awk -F: '/name|cache size|MHz|mips/ { if (!a) b=b $2 }
|
|
Packit Service |
1d0348 |
/^$/ { a++ } END { print a" x"b" bmips" }' /proc/cpuinfo
|
|
Packit Service |
1d0348 |
test -e /etc/gentoo-release \
|
|
Packit Service |
1d0348 |
&& gcc --version | head -1 && grep ^CFLAGS /etc/make.conf
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
# tar versions
|
|
Packit Service |
1d0348 |
t=
|
|
Packit Service |
1d0348 |
echo
|
|
Packit Service |
1d0348 |
for tar in $TAR; do
|
|
Packit Service |
1d0348 |
if which $tar &> /dev/null; then
|
|
Packit Service |
1d0348 |
t="$t $tar";
|
|
Packit Service |
1d0348 |
echo -ne "$tar:\t"; $tar --version | head -1;
|
|
Packit Service |
1d0348 |
fi
|
|
Packit Service |
1d0348 |
done
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
TAR="$t"
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
echo -e "\nbest time of $n repetitions,\n"\
|
|
Packit Service |
1d0348 |
" src=$src, "\
|
|
Packit Service |
1d0348 |
`du -sh $src | awk '{print $1}'`" in "`find $src | wc -l`" files, "\
|
|
Packit Service |
1d0348 |
"avg "$((`du -sk $src | awk '{print $1}'`/`find $src -type f | wc -l`))"KB/file,\n"\
|
|
Packit Service |
1d0348 |
" archive=$dst, extract to $dst_path"
|
|
Packit Service |
1d0348 |
|
|
Packit Service |
1d0348 |
echo -e "program\toperation\treal\tuser\tsystem\t%CPU\t speed"
|
|
Packit Service |
1d0348 |
> /tmp/tcp
|
|
Packit Service |
1d0348 |
let op_num=0
|
|
Packit Service |
1d0348 |
for op in "cf $dst $pax -C $src ." "tf $dst" "xf $dst -C $dst_path" \
|
|
Packit Service |
1d0348 |
"f $dst -C $dst_path --diff"; do
|
|
Packit Service |
1d0348 |
let tar_num=0
|
|
Packit Service |
1d0348 |
for tar in $TAR; do
|
|
Packit Service |
1d0348 |
echo -en "$tar\t${OPN[op_num]}\t"
|
|
Packit Service |
1d0348 |
for ((i=1; i<=$n; i++)); do
|
|
Packit Service |
1d0348 |
echo $op | grep -q ^cf && rm -f $dst
|
|
Packit Service |
1d0348 |
echo $op | grep -q ^xf &&
|
|
Packit Service |
1d0348 |
{ chmod -R u+w $dst_path
|
|
Packit Service |
1d0348 |
rm -rf $dst_path; mkdir $dst_path; }
|
|
Packit Service |
1d0348 |
sync
|
|
Packit Service |
1d0348 |
if echo $op | grep -q ^f; then # op == compare
|
|
Packit Service |
1d0348 |
time $tar $op ${OPT[$tar_num]} > /dev/null
|
|
Packit Service |
1d0348 |
else # op in (create | list | extract)
|
|
Packit Service |
1d0348 |
time $tar $op ${OPT[$tar_num]} > /dev/null \
|
|
Packit Service |
1d0348 |
|| break 3
|
|
Packit Service |
1d0348 |
fi 2>> /tmp/tcp
|
|
Packit Service |
1d0348 |
done
|
|
Packit Service |
1d0348 |
use_times
|
|
Packit Service |
1d0348 |
let tar_num++
|
|
Packit Service |
1d0348 |
done
|
|
Packit Service |
1d0348 |
let op_num++
|
|
Packit Service |
1d0348 |
echo
|
|
Packit Service |
1d0348 |
done
|
|
Packit Service |
1d0348 |
rm -rf $dst_path $dst
|
|
Packit Service |
1d0348 |
echo
|
|
Packit Service |
1d0348 |
cat /tmp/tcp
|
|
Packit Service |
1d0348 |
rm -f /tmp/tcp
|