linux shell 附有明细的文件复制

业务需求

在linux执行文件夹或文件复制时,有时需要知道哪些文件更新了,哪些文件没有更新,哪些文件是新建的。基于此需求决定编写一个shell脚本来达到此目的。

shell 代码

1.扫描文件夹

function scan_src_dir_folder  {
  ls "$SRC_DIR" | while read file
  do
    if [ -d "$SRC_DIR/$file" ];
      then
        if [ ! -d "$DST_DIR/$file" ] ;
          then
            out_i "Mkdir $DST_DIR/$file"
            mkdir -p $DST_DIR/$file
        fi
    fi

    if [ -f "$SRC_DIR/$file" ];
      then
        copy_on_modify "$SRC/$file" "$DST_DIR/$file"
    fi
  done
}

2.递归扫描文件

function scan_src_dir_file {
  ls "$1" | while read file
  do
    if [ -d "$1/$file" ];
      then
        if [ ! -d "$2/$file" ];
          then
            out_i "mkdir $2/$file"
            mkdir - p $2/$file
        fi
        scan_src_dir_file "$1/$file" "$2/$file"
    fi
    
    if [ -d "$1/$file" ]
      then
        copy_on_modify "$1/$file" "$2/$file"
    fi
  done
}

3.复制文件

function copy_on_modify {
  if [ -f $2 ]
    then
      cmp "$1" "$2" > /dev/null 2>&1
      if [ $? = 0 ]
        then
          touch "$2"
      else
        echo "CP-F -> $1"
        cp -f "$1" "$2"
      fi
  else
    echo "CP-N -> $1"
    cp -f "$1" "$2"
  FI
}

4.日志输出

COLOR_INFO="echo -en \\033[1;32m"
COLOR_RESET="echo -en \\033[0m"

function out_i {
  $COLOR_INFO
  echo $*
  $COLOR_RESET
}

shell 指令附录

  1. -d filename 如果filename为目录,则为真;
  2. -f filename 如果filename为常规文件,则为真;
  3. cmp 命令是用于比较2个文件是否有差异;
  4. touch 命令是用于更改文件的时间属性;
  5. /dev/null 2>&1 cmp的比较结果命令将不会输出任何信息到控制台,也不会有任何信息输出到文件中;

你可能感兴趣的:(linux shell 附有明细的文件复制)