Много приказки са излишни
Нова версия:
#!/bin/sh
_fname= _errexit= _zip= _user_host=
_zip=/bin/bzip2
_ts=`date +%Y%m%d_%H%M%S`
_ext=bz2
_usage_msg="
usage: $0 -f <file_name> -h user@host [ -e | -g ]
-f file name containing pathnames
-e exit if path does not exists
-g use gzip (otherwise bzip2)
-h remote user@host
"
die() {
printf >&2 '%s\n' "$@"
exit 1
}
[ $# -lt 1 ] && die "$_usage_msg"
# This commands do not work with all shells,
# because the set command does not always return an error code
# if getopt fails
set -- `getopt f:egh: "$@"` ||
die "$_usage_msg"
while [ $# -gt 0 ]; do
case $1 in
-f ) shift; _fname=$1; shift ;;
-e ) shift; _errexit=on ;;
-g ) shift; _zip=/bin/gzip _ext=gz ;;
-h ) shift; _user_host=$1; shift ;;
-- ) break ;;
esac
done
[ -r "$_fname" ] || die "invalid filename: $_fname"
case $_user_host in
*@* ) ;;
* ) die "invalid host: $_user_host" ;;
esac
touch arch_"$_ts".tar
while IFS= read f; do
[ -f "$f" ] && [ ! -L "$f" ] || {
[ "$_errexit" ] &&
die "invalid path: $f" ||
continue
}
tar uf arch_"$_ts".tar "$f" ||
die 'tar failed'
done < "$_fname" ||
exit 1
"$_zip" arch_"$_ts".tar ||
die 'compressing archive file failed'
scp arch_"$_ts.tar.$_ext" "$_user_host": ||
die 'scp failed'
Прочитайки отново пост #1, реших, че може да не съм разбрал правилно.
Въпросът е с повишена трудност, ако, както бях разбрал, скриптът трябва да работи
със старата Bourne shell (за да съм по-ясен: /bin/shell на Solaris
[the old Bourne shell], не /usr/bin/shell на HP-UX [която всъщност е ksh88]).
Ако в действителност изискването е скриптът да е стандартен/POSIX - нещата стават
мнооого по-лесни
С -e в някой случаи може да остане (частичен) tar file.
Ако това не е желателно, виждайки, че сме малко параноични,
ще трябва да се работи първо върху временен file
(име генерирано с mktemp
) който да се преименува само след успешно архивиране.