1

我试图构建一个快速脚本来查找目录下的所有 git repos,并依次“git pull”每个。

这是我到目前为止发现的:

find ~/ -name ".git" -type d | sed 's,/*[^/]\+/*$,,' | xargs -L1 bash -c 'cd "$1" && git pull' _

如果粘贴到终端中,这将完全按照预期工作。但是,如果我在我的.bashrc文件中将其设为别名:

alias gpa="find ~/ -name ".git" -type d | sed 's,/*[^/]\+/*$,,' | xargs -L1 bash -c 'cd "$1" && git pull' _"

该命令不起作用。我对其进行了修改,试图让它打印 xargs 启动的子shell正在接收的内容:

alias printgpa="find ~/ -name ".git" -type d | sed 's,/*[^/]\+/*$,,' | xargs -L1 bash -c 'echo "$1"' _"

运行时,每个子shell 都打印一个换行符,但没有其他内容。

谁能回答为什么会这样?我的直觉说这是我在别名中的语法有问题,但我不知道到底发生了什么。

4

2 回答 2

2

问题是$1在您定义别名时被替换,而不是在您运行它时。为了防止这种情况,您需要$使用反斜杠或使用一些单引号来引用 。例如:

alias printgpa='find ~/ -name .git -type d | sed '\''s,/*[^/]\+/*$,,'\'' | xargs -L1 bash -c '\''echo "$1"'\'' _'
于 2013-02-21T18:16:00.797 回答
2

使用 GNU Parallel 时可能更容易阅读:

alias gpa="find ~/ -name .git -type d | parallel 'cd {//} && git pull'"

此外,您还可以获得让更多 git 并行处理的额外好处。

安装 GNU Parallel 实际上需要 10 秒:

wget pi.dk/3 -qO - | sh -x

观看介绍视频以了解更多信息:https ://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2013-04-19T22:49:18.497 回答