猛击。逐行输出到另一个过程

Mad*_*zeR 3 git bash

我有一个简单的 GIT 脚本: cp --parents $(git diff --name-only $1 $2) $3

git diff ...- 获取提交之间修改的文件列表($1 和 $2)。

cp --parents ...- 将它们复制到所需的目录($3)。

但唯一的问题存在:目录名称中存在空格。在这种情况下,脚本无法正常工作。显然,每一行git diff输出都应该用引号引起来,但是如何呢?

或者还有其他解决方案吗?还找不到。

Vla*_*lad 5

git diff支持-z使用 NUL 分隔名称的选项。然后您可以通过管道将其通过xargs。例子:

$ git diff -z --name-only HEAD^ HEAD | xargs -I% -0 cp --parents "%" /tmp/
Run Code Online (Sandbox Code Playgroud)

选项xargs

  • -0使其期望输入数据以 NUL 分隔;
  • -I%让它在每个输入中运行一次命令,并%在命令行中替换为输入(显然是-i%在 Windows 上?)。%是任意选择的,因为它很短,您也可以使用-IFOO/ ;"FOO"
  • cp ...要执行的命令。

我用/tmp/作为一个安全的例子。

所以这应该有效地运行

$ cp --parents "file1" /tmp/
Run Code Online (Sandbox Code Playgroud)

等等。或者,您可以git diff在 Bash 中逐行读取输出。

$ git diff --name-only HEAD^ HEAD | ( while read fn ; do cp "${fn}" /tmp/ ; done )
Run Code Online (Sandbox Code Playgroud)