Mac终端 - 在每行输出上运行命令

时间:2015-09-28 18:42:38

标签: git command-line terminal backup rsync

我最近开始使用Git作为我公司网站文件的版本控制系统和部署工作流程。我还没有找到一种简单的方法来备份Commit中的更新文件(这样每次都不会对所有项目文件进行冗余备份),而且我已经集思广益了一种方法来输出文件。使用以下命令提交:

git show --pretty="format:" --name-only {COMMIT_ID}

...其中{COMMIT_ID}是提交的8个字符的ID。

这个工作,并以一种很好的方式输出文件,每行一个文件。

我想要做的是捕获此输出的每一行,例如:

/a/b/c/file1.txt
/a/b/c/d/file2.txt
/x/y/file3.txt
/x/y/z/file4.txt

...并在此输出的每一行上执行以下终端命令,以使用rsync制作每个文件的副本:

rsync -aR ~/Git/repo/./{OUTPUT_LINE} ~/Commit/repo/{COMMIT_ID}/

...其中{OUTPUT_LINE}是输出的这一行(例如/a/b/c/file1.txt),而{COMMIT_ID}是之前提交的8个字符的ID。

TLDR;

如何在终端命令的多行输出的每一行结果上运行命令?

进一步说明

  • 我熟悉|管道,但仅限于基础层面,我不知道如何利用它。

  • 扩展我的rsync命令:这将从我的本地目录中获取diff文件,该目录包含Git repo文件,创建文件的目录结构,并一次性复制文件。没有同步。

  • 我计划在AppleScript中使用此备份工作流程,在对话框中请求提交ID,以便快速复制,粘贴和转发。然后它将运行终端命令,并在完成时触发最后一个提示。

  • 将执行此备份的完整系列终端命令如下:

mkdir ~/Commit/repo/{COMMIT_ID}
cd ~/Git/repo
git show --pretty="format:" --name-only {COMMIT_ID}
rsync ...

说明:

  1. ~/Commit/repo/备份文件夹
  2. 中创建新目录
  3. 加载此Git仓库
  4. 显示上次提交中更改的文件
  5. 对于每一个,rsync文件到备份文件夹

1 个答案:

答案 0 :(得分:1)

xargs是你的朋友:

git show --pretty="format:" --name-only "$COMMIT_ID" |
xargs -L 1 -I FILENAME rsync -aR ~/Git/repo/./FILENAME ~/Commit/repo/"$COMMIT_ID"/

选项:

  • -L 1 - 一次读取一行输入,而不是默认值,以便在命令行中输入尽可能多的输入项。
  • -I FILENAME - 使用字符串" FILENAME"作为输入项的占位符。