免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 560 | 回复: 0

[文件目录] 共享目录的方便COPYIN COPYOUT [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
发表于 2016-10-19 20:04 |显示全部楼层
本帖最后由 jeppeter 于 2016-10-20 08:48 编辑

实现功能:
    方便在.git管理的代码与远程smbmount上来的目录进行方便的copy in / copy out,可以做到目录结构copy ,能够利用bash auto-completion进行,并且自动实现 dos2unix

有三个文件构成
分别是cpfuncs
cpin
cpout

这三个文件要放在同一目录

cpfuncs
  1. #! /bin/sh

  2. CP=/bin/cp
  3. SED=/bin/sed
  4. FIND=/usr/bin/find
  5. XARGS=/usr/bin/xargs
  6. MKDIR=/bin/mkdir
  7. SUDO_PREFIX=/usr/bin/sudo
  8. ECHO=/bin/echo
  9. READLINK=/bin/readlink
  10. GREP=/bin/grep
  11. WC=/usr/bin/wc
  12. PWD=/bin/pwd
  13. TAIL=/usr/bin/tail
  14. MOUNT=/bin/mount
  15. UMOUNT=/bin/umount
  16. AWK=/usr/bin/awk

  17. SPLITAWK_STR='{curidx=1;curitem="";printout=0;curcon=$0;n=split($0,a);for(i=1;i<=NF;i++){spaces="";idx=index(curcon,a[i]);if(idx>1){spaces=substr(curcon,1,idx-1);curcon=substr(curcon,length(spaces)+1);}curcon=substr(curcon,length(a[i])+1);if(length(a[i])==0){if(length(curitem)>0){curitem=sprintf("%s%s",curitem,spaces);}continue;}if(a[i]==splitchar){if(curidx==searchidx){printf("%s\n",curitem);printout=1;break;}curitem="";curidx+=1;continue;}if(length(curitem)>0){curitem=sprintf("%s%s%s",curitem,spaces,a[i]);}else{curitem=$i;}}if(printout==0&&curidx==searchidx){printf("%s\n",curitem);printout=1;}}'
  18. EQUALAWK_STR='{if($0==searchvar){print$0}}'


  19. GetSmbMountDir()
  20. {
  21.         if [ -n "$CP_SMB_DIR" ]
  22.                 then
  23.                 # if we have CP_SMB_DIR
  24.                 # so we do this
  25.                 ${ECHO} "$CP_SMB_DIR"
  26.                 return
  27.         fi
  28.         _mountdir=`${MOUNT} | ${GREP} -e '^//' |  ${AWK} -v splitchar=on -v searchidx=2 "$SPLITAWK_STR"  | ${AWK} -v splitchar=type -v searchidx=1 "$SPLITAWK_STR" | ${TAIL} -1`
  29.         ${ECHO} "$_mountdir"
  30.         return
  31. }


  32. GetGitDir()
  33. {
  34.         _curdir=`${PWD}`
  35.         while [ True ]
  36.         do
  37.                 if [ -z "$_curdir" ] || [ "$_curdir" = "/" ]
  38.                         then
  39.                         ${ECHO} "/"
  40.                         return
  41.                 fi
  42.                 if [ -d "$_curdir/.git" ]
  43.                         then
  44.                         ${ECHO} "$_curdir"
  45.                         return
  46.                 fi
  47.                 _curdir=`dirname $_curdir`
  48.         done
  49. }

  50. IsSub()
  51. {
  52.         _base1="$1"
  53.         _cur1="$2"
  54.         _base=`${READLINK} -f "$_base1"`
  55.         _cur=`${READLINK} -f "$_cur1"`
  56.         _base="$_base/"
  57.         _cur="$_cur/"
  58.         _issub=`${ECHO} -n "$_cur" | ${GREP} -E "^$_base" | ${WC} -c`
  59.         if [ $_issub -gt 0 ]
  60.                 then
  61.                 ${ECHO} "1"
  62.                 return
  63.         fi
  64.         ${ECHO} "0"
  65.         return
  66. }

  67. GetSubDir()
  68. {
  69.         _base1="$1"
  70.         _cur1="$2"
  71.         _base=`${READLINK} -f "$_base1"`
  72.         _cur=`${READLINK} -f "$_cur1"`
  73.         _base="$_base/"
  74.         _cur="$_cur/"
  75.         _subdir=`${ECHO} -n "$_cur" | ${SED} 's|^'"$_base"'||' | ${SED} 's|/$||'`
  76.         ${ECHO} "$_subdir"
  77.         return
  78. }

复制代码




cpin
  1. #!/bin/sh

  2. script_file=`which $0`
  3. if [  -z "$script_file"  ]
  4. then
  5.         script_file=`readlink -f $0`
  6. fi
  7. script_dir=`dirname $script_file`

  8. . "$script_dir/cpfuncs"

  9. DEF_MNTDIR=$(GetSmbMountDir)
  10. gitbase_dir=$(GetGitDir)
  11. DEF_BASEDIR=`basename $gitbase_dir`

  12. mntdir=$DEF_MNTDIR
  13. basedir=$DEF_BASEDIR

  14. Usage()
  15. {
  16.         _ec=$1
  17.         _fmt=$2
  18.         _fp=/proc/$/fd/2

  19.         if [ $_ec -eq 0 ]
  20.                 then
  21.                 _fp=/proc/self/fd/1
  22.         fi

  23.         if [ -n "$_fmt" ]
  24.         then
  25.                 ${ECHO} "$_fmt" >$_fp
  26.         fi

  27.         ${ECHO} "$0 [OPTIONS] directorys..." >$_fp
  28.         ${ECHO} "  -h|--help              to display this help information" >$_fp
  29.         ${ECHO} "  -m|--mntdir <dir>      to specify mount dir default($DEF_MNTDIR)" >$_fp
  30.         ${ECHO} "  -b|--basedir <dir>     to specify basedir default($DEF_BASEDIR)" >$_fp
  31.         ${ECHO} "  srcdir                 ($DEF_MNTDIR/$DEF_BASEDIR)" >$_fp
  32.         ${ECHO} "  directorys...          from current directory" >$_fp

  33.         exit $_ec
  34. }



  35. CopyFrom()
  36. {
  37.         _todir="$1"
  38.         _frombase="$2"
  39.         _basedir="$3"

  40.         if [ -d "$_frombase/$_todir" ]
  41.         then
  42.                 _bname=`dirname "$_basedir/$_todir"`
  43.                 if [ ! -d "$_bname" ]
  44.                         then
  45.                         ${MKDIR} "$_bname"
  46.                 fi
  47.                 ${CP}  -r -f "$_frombase/$_todir"  "$_bname"
  48.                 ${FIND} "$_basedir/$_todir" -type f | ${XARGS} -I {} ${SED} -i 's/\r//g' {}
  49.         else
  50.                 _bname=`dirname $_basedir/$_todir`
  51.                 if [ ! -d "$_bname" ]
  52.                         then
  53.                         ${MKDIR} "$_bname"
  54.                 fi
  55.                 ${CP} -f "$_frombase/$_todir" "$_basedir/$_todir"
  56.                 ${SED} -i 's/\r//g' "$_basedir/$_todir"
  57.         fi
  58. }

  59. while [ $# -gt 0 ]
  60. do
  61.         breakone=0
  62.         case "$1" in
  63.                 -h|--help)
  64.                         Usage 0 ""
  65.                         ;;
  66.                 -m|--mntdir)
  67.                         if [ $# -gt 1 ]
  68.                         then
  69.                                 mntdir="$2"
  70.                                 shift
  71.                         else
  72.                                 Usage 3 "$1 need arg"
  73.                         fi
  74.                         ;;
  75.                 -b|--basedir)
  76.                         if [ $# -gt 1 ]
  77.                         then
  78.                                 basedir="$2"
  79.                                 shift
  80.                         else
  81.                                 Usage 3 "$1 need arg"
  82.                         fi
  83.                         ;;
  84.                 *)
  85.                         breakone=1
  86.                         ;;                        
  87.         esac
  88.         if [ $breakone -gt 0 ]
  89.                 then
  90.                 break
  91.         fi
  92.         shift
  93. done

  94. if [ -z "$mntdir" ]
  95.         then
  96.         Usage 4 "please specify mountdir by -m|--mntdir or mount them or export CP_SMB_DIR environment value"
  97. fi


  98. for item in $@
  99. do
  100.         _absitem=`${READLINK} -f $item`
  101.         _issubdir=$(IsSub "$gitbase_dir" "$_absitem")
  102.         if [ $_issubdir -gt 0 ]
  103.                 then
  104.                 curitem=$(GetSubDir "$gitbase_dir" "$_absitem")               
  105.                 CopyFrom "$curitem" "$mntdir/$basedir" "$gitbase_dir"
  106.         else
  107.                 ${ECHO} "item($item) not sub ($gitbase_dir)" >&2
  108.         fi
  109. done

复制代码




cpout

  1. #!/bin/sh


  2. script_file=`which $0`
  3. if [  -z "$script_file"  ]
  4. then
  5.         script_file=`readlink -f $0`
  6. fi
  7. script_dir=`dirname $script_file`

  8. . "$script_dir/cpfuncs"

  9. DEF_MNTDIR=$(GetSmbMountDir)
  10. DEF_BASEDIR=

  11. gitbase_dir=$(GetGitDir)
  12. DEF_BASEDIR=`basename $gitbase_dir`
  13. if [ "$DEF_BASEDIR" = "/" ]
  14. then
  15.         DEF_BASEDIR=""
  16. fi

  17. basedir=$DEF_BASEDIR
  18. mntdir=$DEF_MNTDIR

  19. Usage()
  20. {
  21.         _ec=$1
  22.         _fmt=$2
  23.         _fp=/proc/$/fd/2

  24.         if [ $_ec -eq 0 ]
  25.                 then
  26.                 _fp=/proc/self/fd/1
  27.         fi

  28.         if [ -n "$_fmt" ]
  29.         then
  30.                 ${ECHO} "$_fmt" >$_fp
  31.         fi

  32.         ${ECHO} "$0 [OPTIONS] files..." >$_fp
  33.         ${ECHO} "  -h|--help              to display this help information" >$_fp
  34.         ${ECHO} "  -m|--mntdir <dir>      to specify mount dir default($DEF_MNTDIR)" >$_fp
  35.         ${ECHO} "  -b|--basedir <dir>     to specify basedir default($DEF_BASEDIR)" >$_fp
  36.         ${ECHO} "  destdir                ($DEF_MNTDIR/$DEF_BASEDIR)" >$_fp
  37.         ${ECHO} "  files...               files or directory from current directory" >$_fp

  38.         exit $_ec
  39. }



  40. CopyTo()
  41. {
  42.         _todir=$1
  43.         _frombase=$2
  44.         _basedir=$3

  45.         ${ECHO} "from $_basedir/$_frombase to $_todir/$_frombase"
  46.         if [ -d "$_basedir/$_frombase" ]
  47.         then
  48.                 _bname1="$_todir/$_frombase"
  49.                 _bname=`dirname $_bname1`
  50.                 if [ ! -d $_bname ]
  51.                 then
  52.                         ${ECHO} "mkdir -p ($_bname)"
  53.                         ${SUDO_PREFIX} $MKDIR -p "$_bname"
  54.                 fi
  55.             ${SUDO_PREFIX}         ${CP}  -r -f  "$_basedir/$_frombase" "$_bname"
  56.         else
  57.                 _bname=`dirname $_todir/$_frombase`
  58.                 if [ ! -d "$_bname" ]
  59.                         then
  60.                         ${SUDO_PREFIX} $MKDIR -p $_bname
  61.                 fi

  62.                 ${SUDO_PREFIX} ${CP} -f "$_basedir/$_frombase" "$_todir/$_frombase"
  63.         fi
  64. }

  65. while [ $# -gt 0 ]
  66. do
  67.         breakone=0
  68.         case "$1" in
  69.                 -h|--help)
  70.                         Usage 0 ""
  71.                         ;;
  72.                 -m|--mntdir)
  73.                         if [ $# -gt 1 ]
  74.                         then
  75.                                 mntdir="$2"
  76.                                 shift
  77.                         else
  78.                                 Usage 3 "$1 need arg"
  79.                         fi
  80.                         ;;
  81.                 -b|--basedir)
  82.                         if [ $# -gt 1 ]
  83.                         then
  84.                                 basedir="$2"
  85.                                 shift
  86.                         else
  87.                                 Usage 3 "$1 need arg"
  88.                         fi
  89.                         ;;
  90.                 *)
  91.                         breakone=1
  92.                         ;;                        
  93.         esac
  94.         if [ $breakone -gt 0 ]
  95.                 then
  96.                 break
  97.         fi
  98.         shift
  99. done

  100. if [ -z "$mntdir" ]
  101.         then
  102.         Usage 4 "please specify mountdir by -m|--mntdir or mount them or export CP_SMB_DIR environment value"
  103. fi


  104. for item in $@
  105. do
  106.         _absitem=`${READLINK} -f $item`
  107.         _issubdir=$(IsSub "$gitbase_dir" "$_absitem")
  108.         if [ $_issubdir -gt 0 ]
  109.                 then
  110.                 curitem=$(GetSubDir "$gitbase_dir" "$_absitem")
  111.             CopyTo "$mntdir/$basedir" "$curitem" "$gitbase_dir"
  112.         else
  113.                 ${ECHO} "item($item) not subdir in ($gitbase_dir)" >&2
  114.         fi
  115. done
复制代码


使用方法,
你只要进入.git 管理的目录,并且在同一台机器上有SMBMOUNT上来的目录就可以了,如果有多个,你最好用环境变量CP_SMB_DIR来确定是哪一个。
举例:
如果你在/home/user/source/working/这个.git项目中,并且你的远程smbmount的目录在/mnt/smbmount上
在working目录下的任一目录调用
  1. cpout cfile/cfiles.c
复制代码


那将自动
  1. cp /home/user/source/working/cfile/cfiles.c /mnt/smbmount/working/cfile/cfiles.c
复制代码


如果在远程没有这个中间目录,会自动创建。

  1. cpin cfile/cfiles.c
复制代码


则会调用
  1. cp /mnt/smbmount/working/cfile/cfiles.c /home/user/source/working/cfile/cfiles.c
复制代码



对于目录也同样适用




您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP