[ncolug] Re: Bash One Liner for Backup File
- From: Chuck <cstickelman@xxxxxxxxxx>
- To: ncolug@xxxxxxxxxxxxx
- Date: Thu, 11 Feb 2016 17:00:23 -0500
On Thu, 2016-02-11 at 16:41 -0500, Chuck wrote:
I'm done! A "Quick" function for making date/time stamped copies of
your files.
cp-date86 ()
{
declare -r datetime=$(date +%Y%m%d.%H%M%S);
declare -a files;
for file in $@;
do
dir=$(dirname $file);
cd $dir && dir=$(pwd) && cd - &> /dev/null;
file=$(basename $file);
files[${#files[*]}]=$dir/$file;
done;
[[ -d ${files[-1]} ]] && dest_dir=${files[-1]} && unset files[-
1];
for file in ${files[@]};
do
if [[ -f $file ]]; then
[[ ! -v dest_dir ]] && dest_dir=$(dirname $file);
[[ ! ${file%.*} == ${file##*.} ]] && ext=${file##*.} &&
file=${file%.*};
[[ -v VERBOSE ]] && echo "Copying $file.$ext to
$dest_dir/${file##*/}.$datetime.$ext";
cp -Pp $file.$ext $dest_dir/${file##*/}.$datetime.$ext;
fi;
done
}
Here the program is with DEBUG statements. run it:
DEBUG=1 cp-date86 ...
for TONS of output, where you can see what's going on along the way.
#!/bin/bash
function cp-date86 ()
{
declare -r datetime=$(date +%Y%m%d.%H%M%S); # All files
processed on the same command-line will get the same date.time
extension.
declare -a files;
for file in $@;
do
[[ -v DEBUG ]] && echo "1: file: $file";
# Get directory name, convert to absolute path.
dir=$(dirname $file);
[[ -v DEBUG ]] && echo "2: dir: $dir";
cd $dir && dir=$(pwd) && cd - &>/dev/null;
[[ -v DEBUG ]] && echo "3: dir: $dir";
# Remove path nodes.
file=$(basename $file);
[[ -v DEBUG ]] && echo "4: file: $file";
files[${#files[*]}]=$dir/$file;
[[ -v DEBUG ]] && echo "5: dir/file: $dir/$file";
done;
unset dir;
[[ -v DEBUG ]] && echo "6: last file: ${files[-1]}";
[[ -d ${files[-1]} ]] && dir=${files[-1]} && unset files[-1];
# If the last file on the command-line is a directory, assume backups
are being stored in it.
[[ -v DEBUG ]] && echo "7: dir: $dir";
for file in ${files[@]};
do
[[ -v DEBUG ]] && echo "8: file: $file";
if [[ -f $file ]];
then
[[ -v DEBUG ]] && echo "9: file exists: $file";
[[ ! -v dir ]] && dir=$(dirname $file);
[[ -v DEBUG ]] && echo "10: dir: $dir";
[[ ! ${file%.*} == ${file##*.} ]] && ext=${file##*.} &&
file=${file%.*};
[[ -v DEBUG ]] && echo "11: file: $file";
[[ -v DEBUG ]] && echo "12: ext: $ext";
[[ -v VERBOSE ]] && echo "Copying $file.$ext to
$dir/${file##*/}.$datetime.$ext";
cp -Pp $file.$ext $dir/${file##*/}.$datetime.$ext;
fi;
done
}
Attachment:
signature.asc
Description: This is a digitally signed message part
Other related posts: