1
0
mirror of synced 2026-01-13 15:37:38 +00:00
2024-01-12 11:59:32 -08:00

70 lines
1.5 KiB
Bash
Executable File

#!/bin/sh
# cpv file dest
# could extend with -r or copying multiple files
file="$1"
dest="$2"
if [ ! -f "$file" ]; then
echo "Error: no such file "$file". Exiting."
exit 1
fi
# if dest is a directory, add the source file name
if [ -d "$dest" ]; then
dest=$dest/`basename $file`
fi
# if (the new) $dest is a directory, then just bail
if [ -d "$dest" ]; then
echo "Error: destination file ($dest) is a directory. Exiting."
exit 1
fi
# if no such file $dest then just copy
if [ ! -f "$dest" ]; then
cp $file $dest
echo "Added $(basename $dest) to $(dirname $dest)"
exit 0
fi
# find maximum version of dest
max=0
for vf in "$dest".~[1-9]*~
do vn=`echo $vf | sed -e 's/^.*\.~\([1-9][0-9]*\)~$/\1/'`
if [ -f $dest.~$vn~ ]; then
if [ $max -lt $vn ]; then
max=$vn
fi
fi
done
if [ $max -eq 0 ]; then # no current versions
mv $dest $dest.~1~ # change version to version 1
new=2
else
if cmp -q $dest $dest.~$max~ >/dev/null 2>&1
then # they're different
max=`expr $max + 1` # make newer version
mv $dest $dest.~$max~
new=`expr $max + 1`
else # dest and dest.~nn~ are equal so
rm $dest # delete dest leave old version behind
new=`expr $max + 1`
fi
fi
# make new version and link it
ln $file $dest.~$new~ >/dev/null 2>&1
if [ $? -ne 0 ]
then
cp -p $file $dest.~$new~
fi
echo "Added $(basename $dest.~$new~) to $(dirname $dest.~$new~)"
rm -f $dest
ln $dest.~$new~ $dest
echo "Linked $(basename $dest) to $(basename $dest.~$new~) in $(dirname $dest)"