在一行中包含空格的tar文件名crontab样式tar/find命令

问题描述:

当以下命令从crontab运行时,遇到文件名中带空格的文件时会发生tar错误。在一行中包含空格的tar文件名crontab样式tar/find命令

/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|^/||'` 

OR

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

相同的错误由焦油抛出。

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

样品与文件名产生的错误: “2016年12月15日名称的文件修复exportICS.php”

焦油:无功/网络/ html-calendar.northpawfamilycloud.xyz /页/ 2016-12- 15: 不能静:没有这样的文件或目录
焦油名:无法统计:没有这样的文件或目录
焦油文件:无法统计:没有这样的文件或目录
焦油修复:无法统计:没有这样的文件或目录
tar:exportICS.php:无法统计:没有这样的文件或目录

注意| SED的| ^/||''带斜线关闭发现这样焦油错误“消除导致不发生斜线

+0

为什么你在根目录下有'tar'?这是一个奇怪的地方,保持一个可执行文件。 –

+0

在crontab中的命令行是1 1 * * */bin/tar我在命令行测试#tar为/ bin在我的服务器的PATH环境变量中 – ml48603

既然你正在做的唯一的过滤是从名字/var/www/html下删除前导斜线,您可以使用单独tar - 避免与find无数的问题:

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

给定目录,tar备份目录的内容。如果您有/var/html下的子目录,则您的存档可能是必要的两倍。这一个不会比必要的更大。


显然,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预期文件名以空终止; -T -表示从标准输入中读取文件名列表。

如果您愿意,您可以将所有这些放在一行上。这不是我做这件事的方式。我将创建一个脚本,该脚本将由执行该任务的croncrontab)系统运行,尤其是如果我运行它的话,输出文件名将不可避免地带有时间戳,并且可能会识别哪个站点被备份备份等。要备份的站点将作为crontab条目提供的脚本的参数。这是我的偏好;有很多人在他们的crontab文件中写入很长的一行。

此外,GNU tar(吵闹)省略从压缩文件名的斜线,以便有由GNU tar产生tar文件中从来没有绝对名称:

tar: Removing leading `/' from member names 

这意味着你能避免子外壳,只需使用find /var/www/html …生成名称,并附带警告消息。既然你有详细的输出,这不太可能是一个问题。

+0

我将tar命令与查找一起提交,因为我通常将切换添加到查找中以启用各种增量备份技术,例如将find命令添加--mmin -1450,以便仅使用10分钟前的24小时修改时间戳对文件进行压缩。 – ml48603

+0

/var/www/html包含一个小站点// var/ww/html1包含下一个smal站点等等。 – ml48603

+0

该命令像冠军一样工作。谢谢! – ml48603

存档用空格

逃生空间用反斜杠或引用的文件名示例。 :

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

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

使用find ... -print0与NUL分隔的文件名L tar ... --null只考虑NULL终止的文件。从GNU tar documentation

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

这是缺少问题。问题不在于存档名称 - 它无论如何都没有空格。问题在于处理名称中有空格的'文件...'中的条目。 –

+0

这将工作以空格对一个文件进行tar操作,但对于同时对数百个文件执行tar命令的命令不起作用。 – ml48603

+0

@JonathanLeffler:是的,你说得对。我编辑了我的答案。 – mauro