【问题标题】:Bash Scripting with xargs to BACK UP files使用 xargs 备份文件的 Bash 脚本
【发布时间】:2020-09-10 22:23:46
【问题描述】:

我需要通过保留文件的目录结构将文件从多个位置复制到 BACK UP 目录。例如,我在以下位置有一个文件“a.txt” /a/b/a.txt /a/c/a.txt a/d/a.txt a/e/a.txt,我现在需要将此文件从多个位置复制到备份目录 /tmp/backup。最终结果应该是:

当我列出 /tmp/backup/a --> 它应该包含 /b/a.txt /c/a.txt /d/a.txt & /e/a.txt。

为此,我使用了命令:echo /a/*/a.txt | xargs -I {} -n 1 sudo cp --parent -vp {} /tmp/backup.这是抛出错误“cp: cannot stat '/a/b/a.txt /a/c/a.txt a/d/a.txt a/e/a.txt': No such file or directory”

-I 选项从 echo 获取完整输入,而不是单个值(如 -n 1 那样)。如果有人可以帮助调试此问题,那将非常有帮助,而不是提供替代命令。

【问题讨论】:

  • 为什么不用cp -r递归复制呢?或者rsync 如果目的地已经是最新的,可以加快速度?

标签: linux echo xargs cp


【解决方案1】:

使用rsync--relative (-R) 选项来保留(部分)源路径。

我使用通配符作为源来匹配您的示例命令,而不是您问题中提到的明确目录列表。

rsync -avR /a/*/a.txt /tmp/backup/

【讨论】:

    【解决方案2】:

    备份是否需要与原件完全相同?在大多数情况下,我更喜欢稍微压缩。 [tar](https://man7.org/linux/man-pages/man1/tar.1.html) 在捆绑包括目录结构在内的东西方面做得很好。

    tar cvzf /path/to/backup/tarball.tgz /source/path/
    

    tar 不能更新压缩包,所以你可以跳过压缩

    tar uf /path/to/backup/tarball.tar /source/path/
    

    这为您提供了一种版本控制,好像只更新更改的文件,但保留之前和之后的版本。

    如果你有时间和周期,还想压缩,可以先解压后再压缩。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2014-09-08
      相关资源
      最近更新 更多