尽管日志显示,tar没有归档所有文件。

4
我正在运行这个命令行:
mysql -h $dbHost -u $dbUser --password=$dbPasswd -N -B -e \
"use cms; select uri from file_managed;" | grep public: | sed \
's/public:\/\//\/amk_aco_data\/cms\//g' | xargs -d "\n" tar -czvf /tmp/cmspublicfile.tgz 

到上周为止,它一直运行良好。但是现在,归档文件里仅有300个文件,而不是原来的约2,000个文件。 如果我单独运行并将SQL查询保存到文件中:

mysql -h $dbHost -u $dbUser --password=$dbPasswd -N -B -e \ 
"use cms; select uri from file_managed;" | grep public: | sed \ 
's/public:\/\//\/amk_aco_data\/cms\//g' > files.toarchive 

然后

tar -T files.toarchive -czvf /tmp/cmspublicfile.tgz, 

按照预期运行,我在档案中获得了大约2k个文件。我猜问题与xargs有关,但我不知道为什么它停止工作了。

一些解释:SQL查询打印出文件URL的列表。

有人能给我任何建议,应该检查什么吗?


输入的URI是否包含嵌入的换行符,导致后续的“tar”命令出现问题?您能否将tar中最后一个添加到归档文件中的文件与“files.toarchive”中的下一行进行比较,看看下一个文件是否有问题?我不知道为什么使用“-T”会起作用。也许可以使用“set -x”运行整个过程,看看命令在失败时的样子? - Eric Renouf
tar命令不会失败,它会成功地完成。它甚至会打印出所有要归档的文件,但是当我打开归档文件时,大部分文件都不见了。 tar日志和files.toarchive中的最后一行是相同的。看起来它跳过了一些文件夹。 - LenaF
xargs 在包含空格的路径/文件名上也会“中断”。最近引入的项目是否有嵌入空格的可能性? - Jeff Y
这听起来有太多的文件要让 xargs 处理,因此它最终会运行 tar 两次。第二次运行会完全删除第一个 tarball。 - Etan Reisner
Etan,谢谢。听起来是个很好的理由 :) 那有什么办法可以修复吗?还是只能使用文件选项? - LenaF
显示剩余2条评论
1个回答

1

你可以跳过使用xargs和usr tar -T -,直接从标准输入读取文件名。

因此,最后一部分将是:

| tar -T - -czvf /tmp/cmspublicfile.tgz

这更接近于工作版本。

完整的命令应该像这样:

mysql -h $dbHost -u $dbUser --password=$dbPasswd -N -B -e \
"use cms; select uri from file_managed;" | grep public: | sed \
's/public:\/\//\/amk_aco_data\/cms\//g' | tar -czvf /tmp/cmspublicfile.tgz -T -

不确定为什么原始版本停止工作 - 我猜测 xargs 或 tar 在处理太多参数时存在问题。 - Ophir Yoktan
1
命令行有长度限制。xargs 的设计是为了解决这个问题,但需要运行一个命令多次。问题在于,如果一个命令运行多次到同一个输出文件而没有追加到它上面,你会丢失第一个输出文件。这似乎就是这里发生的情况。 - Etan Reisner
“-T -” 在处理有换行符的文件名时会出现问题(原始命令也会,不过至少你可以使用 “xargs” 来正确解决它,而这个命令则无法实现)。 - Etan Reisner
谢谢!但是,| 还会将上一个命令的标准输出作为标准输入传递给下一个命令吗?你能否请示我新命令应该如何编写?我似乎无法使其工作。 - LenaF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接