• 【Shell】xargs的高级用法


    看一个项目中经常用到的下代码方法:
    一、已知条件:
    知道gerrit服务域名与端口(一般默认都是29418),有下代码权限;通过测试命令看是否有权限,简单测试命令如下:

    ssh -p 29418 xxxx.xxx.xxx
    

    二、下代码原理:
    1.通过ssh命令获取到所有的project;
    2.逐个git初始化project仓库(git init --bare xxx.git);
    3.逐个仓库fetch (git fetch --all)
    三、知识点梳理:
    1⃣️

    ssh -p 29418 xxxx.xxx.xxx gerrit --help
    ssh -p 29418 xxxx.xxx.xxx gerrit ls-projects --help
    ssh -p 29418 xxxx.xxx.xxx gerrit ls-projects --type CODE  -r REGEX
    

    2⃣️

    shuf:把输入行按随机顺序输出到标准输出。
    
    
    用法: shuf [选项]... [文件]
     或者:  shuf -e [选项]... [参数]...
     或者:  shuf -i LO-HI [选项]...
    
    
    常用参数:
      -e, --echo			将每个参数视为输入行
      -i, --input-range=LO-HI	将LO 到HI 的每个数字视为输入行
      -n, --head-count=行数		最多输出指定的行数
      -o, --output=文件		将结果输出到指定文件而非标准输出
          --random-source=文件	从指定文件获得随机比特
      -z, --zero-terminated	以0 结束行而非新行
          --help		显示此帮助信息并退出
          --version		显示版本信息并退出
    
    
    如果没有指定文件,或者文件为"-",则从标准输入读取。
    

    3⃣️

    xargs命令的作用,是将标准输入转为命令行参数。
    真正执行的命令,紧跟在xargs后面,接受xargs传来的参数。
    xargs的作用在于,大多数命令(比如rm、mkdir、ls)与管道一起使用时,都需要xargs将标准输入转为命令行参数。
    $ echo "one two three" | xargs mkdir
    上面的代码等同于mkdir one two three。如果不加xargs就会报错,提示mkdir缺少操作参数。
    $ echo "hello world" | xargs echo
    hello world
    

    http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html
    四、实际项目中用到的shell脚本函数:

    function git_clone_all(){
        local L_REGEX="$1"  # REGEX 正则匹配需要获取哪个目录下的所有的git仓库
    
        local L_LENGTH="$2"  # 去掉开头git仓库路径,如果cd到其下子目录了。这里需要去掉。
    
        ssh -p ${gerrit_port} ${gerrit_host} gerrit ls-projects --type CODE -r "${L_REGEX}" | shuf | xargs -r -n1 -P4 -I% bash -c '
        L_LOCAL_GIT=${1:${2}}.git  
        #shell字符串切片:${variable_name:start_position:length} 
        # $ string=abcdefghijklmnopqrstuvwxyz 
        # $ echo ${string:4} efghijklmnopqrstuvwxyz
        L_REMOTE_GIT=${3}/${1}
    
        echo "will init for ${L_LOCAL_GIT} with ${L_REMOTE_GIT}"
    
        git init --quiet --bare ${L_LOCAL_GIT}
    
        cat >${L_LOCAL_GIT}/config <<EOF
    [core]
    	repositoryformatversion = 0
    	filemode = true
    	bare = true
    [remote "origin"]
    	url = ${L_REMOTE_GIT}
    	fetch = +refs/*:refs/*
    	mirror = true
    EOF
        find ${L_LOCAL_GIT}/objects -type f -empty -delete -print #查找空对象文件删除
        find ${L_LOCAL_GIT}/refs -type f -empty -delete -print
        git -C ${L_LOCAL_GIT} fetch --all
    
        ' "_" "%" "${L_LENGTH}" "ssh://${gerrit_host}:${gerrit_port}"
    
    }
    
  • 相关阅读:
    《把时间当作朋友》后记
    《把时间当作朋友》 李笑来
    chrome 和 IE 下 new Date()的不同 导致ajax出错
    ruby vim环境设置
    ASP.NET UserControl传递参数
    win2008 IIS7 ASP 的 405 错误
    天使的微笑——《天使爱美丽》
    随机点击表中某一行
    页面刷新方法
    随机选择下拉列表中的值
  • 原文地址:https://www.cnblogs.com/wucaiyun1/p/16002171.html
Copyright © 2020-2023  润新知