[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: