【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}"

}
posted @ 2022-03-13 22:55  爱啦啦  阅读(339)  评论(0编辑  收藏  举报