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 …
来生成名称,同时使用警告消息。既然你有冗长的输出,那可能不是什么大问题。
当从 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 …
来生成名称,同时使用警告消息。既然你有冗长的输出,那可能不是什么大问题。