tar 单行 crontab 样式中带空格的文件名 tar / find 命令

tar filenames with spaces in a one line crontab style tar / find command

当从 crontab 运行以下命令时 tar 遇到文件名中包含空格的文件时会发生错误。

/tar -C / -zcvf /root/archive-of-files-with-spaces-in-filename.tar.gz `find /var/www/html -mmin -1450 -print | sed 's|^/||'`

将开关更改为 -print0 或完全删除 -print 开关并不能解决问题:

/tar -C / -zcvf /root/archive-of-files-with-spaces-in-filename.tar.gz `find /var/www/html -mmin -1450 -print0 | sed 's|^/||'`

/tar -C / -zcvf /root/archive-of-files-with-spaces-in-filename.tar.gz `find /var/www/html -mmin -1450 | sed 's|^/||'`

tar 抛出相同的错误。

如何重写命令以允许将带空格的文件名提供给 tar 而不会分解为不存在的目录名?

文件名产生的错误示例: “2016-12-15 名称文件修复 exportICS.php”

tar: var/www/html-calendar.northpawfamilycloud.xyz/pages/2016-12-15: 无法统计:没有这样的文件或目录
tar: 名称: 无法统计: 没有那个文件或目录
tar:文件:无法统计:没有这样的文件或目录
tar:修复:无法统计:没有那个文件或目录
tar: exportICS.php: 无法统计: 没有那个文件或目录

注意 | sed 's|^/||'` 去除前导斜线发现 tar 错误“删除前导斜线不会发生。

带空格存档:

使用反斜杠转义空格或引用文件名。示例:

tar czvf /my/path/filename\ with\ spaces.tgz files...

如果要归档的文件名称中有空格:

使用find ... -print0用NULL分隔文件名tar ... --null只考虑NULL结尾的文件。来自 GNU tar documentation:

find /path ... -print0 | tar  ... --null -T -

由于您所做的唯一过滤是从 /var/www/html 下的名称中删除前导斜杠,您可以单独使用 tar — 避免 find 的无数问题:

tar -C / -czvf /root/archive-of-files-with-spaces-in-filename.tar.gz var/www/html

给定一个目录,tar备份目录的内容。如果 /var/html 下有 sub-directories,您的存档可能是所需大小的两倍。这个不会比需要的大。


显然,find 命令包含选项。在那种情况下,你必须以另一种方式做事:

(cd /; find var/www/html -type f -mmin -1450 -print0) |
 tar -C / --null -T - --czvf /root/archive-of-files-with-spaces-in-filename.tar.gz

cd /; find var/html 避免了来自 find 的前导斜线。 -print0 对文件名使用空终止符。 --null 告诉 tar 期望文件名是 null-terminated; -T - 表示从标准输入读取文件名列表。

如果您愿意,可以将所有内容放在一行中。这不是我会做的方式。我将创建一个由 cron (crontab) 系统执行的 运行 脚本来完成这项工作,特别是因为输出文件名不可避免地是 time-stamped 如果我正在 运行ning 它,它可能会识别正在备份的站点等。要备份的站点将是脚本的参数,由 crontab 条目提供。那是我的偏好;有很多人在他们的 crontab 文件中写入长行。

此外,GNU tar(大声地)省略了存档名称中的前导斜杠,因此 GNU tar 生成的 tar 文件中永远不会有绝对名称:

tar: Removing leading `/' from member names

这意味着您可以避免使用 sub-shell 并简单地使用 find /var/www/html … 来生成名称,同时使用警告消息。既然你有冗长的输出,那可能不是什么大问题。