【问题标题】:How do you recursively `scp` files specified by command output?你如何递归地由命令输出指定的 `scp` 文件?
【发布时间】:2021-02-18 22:50:16
【问题描述】:

我只想scp git 存储库中跟踪的文件。

例如,git ls-files 命令的输出如下:

$ git ls-files
someFile
src/file1.txt
src/file2.txt
anotherFile

scp 接受这样的输入:scp someFile src/file1.txt src/file2.txt anotherFile <destination>,我可以使用 scp $(git ls-files) <destination> 生成它。这样做的问题是,只是将所有文件转储到 <destination> 而不维护文件夹结构。我想为此使用scp -r,但我不知道如何过滤文件,以便仅复制使用git ls-files 命令显示的文件。也许有一些方法可以为此使用xargs...

【问题讨论】:

  • 请注意,scp $(git ls-files) destination 有一些严重的错误(除非您关闭 globbing 并事先修改 IFS -- 即便如此,它也只有使用 git 才安全,它不允许文件名包含换行符,而 一般 在 UNIXy 系统上允许换行符)。如果您的文件名包含空格或全局字符,它们将被拆分为多个参数。这部分在BashPitfalls #1 中进行了讨论。
  • ...这是 xargs -d $'\n' 可以解决的问题,如果您使用的是 GNU 风格的系统,尽管在值的情况下(像这样)正确使用需要一些注意被替换为非最终位置;一些“明显”和常见的使用模式有自己的安全漏洞(从不使用xargs -I{} sh -c '...{}...')。

标签: shell glob scp


【解决方案1】:

使用rsync

git ls-files | rsync -a --files-from=- . <destination>

如果没有,您可以使用--files-from 创建一个tar,并在另一侧使用sshtar

如果没有,则创建一个临时目录,将所有文件复制到本地,同时保留目录结构,然后使用scp -r 复制该临时目录。

【讨论】:

  • 只有tar 版本有效。 rsync 如果以相同的方式调用,则具有相同的行为,并且“在保留目录结构的同时复制所有文件”是 OP 首先遇到的问题
  • rsync --relative,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 2017-09-22
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多