使用xargs进行Bash脚本备份文件

问题描述

我需要通过保留目录结构将文件从多个位置复制到BACK UP目录。例如,我在以下位置/a/b/a.txt /a/c/a.txt a / d / a.txt a / e / a.txt中有一个文件“ 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:无法统计'/a/b/a.txt /a/c/a.txt a / d / a.txt a / e / a.txt':没有这样的文件或目录”

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

解决方法

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

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

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

备份是否需要与原始备份完全相同?在大多数情况下,我希望稍微压缩一下。 [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/

这使您可以进行某种版本控制,就像仅更新更改的文件一样,而同时保留之前和之后的版本。

如果您有时间和周期,但仍希望进行压缩,则可以先解压缩然后再压缩。