Bash 焦油不';t存档所有文件,尽管日志中另有说明

Bash 焦油不';t存档所有文件,尽管日志中另有说明,bash,shell,tar,Bash,Shell,Tar,我正在运行以下命令行: 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 直到一周前,它还在正常工作。 但是现在,我没有

我正在运行以下命令行:

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 
直到一周前,它还在正常工作。 但是现在,我没有存档~2k个文件,而是在存档中只得到300个文件。 如果单独运行并将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列表


有人能告诉我应该检查什么吗?

您可以跳过xargs和usr tar-T,它们将从stdin读取文件名

因此,lat部分将是:

| 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 -

是否输入了一个包含嵌入换行符的uri,并且不知何故导致
tar
稍后阻塞?您能否将添加到tar中的最后一个文件与
文件中的下一行进行比较,并查看下一个文件是否有问题?我不知道为什么它会与
-t
一起工作,但是。也许用
set-x
运行整个过程,看看命令失败时是什么样子?tar命令没有失败,它成功地完成了。它甚至打印出它正在存档的所有文件,但当我打开存档时,大部分文件都丢失了。tar log和files.toarchive中的最后一行是相同的。它似乎跳过了您作为同一用户运行这两个命令时内部的一些文件夹,因此作为一个用户或类似的用户读取文件不是问题?同一个用户,对所有文件的权限相同,并且在包含空间的路径/文件名上,xargs也“断开”。最近引入的项目是否有嵌入空间?不确定原始版本为何停止工作-我猜测xargs或tar在许多参数上存在问题命令行有长度限制
xargs
旨在解决这一问题,但需要多次运行命令。问题是,如果一个命令对同一输出文件多次运行而未附加到该文件,则会丢失第一个输出文件。这听起来像是这里正在发生的事情。
-T-
将对包含换行符的文件名产生问题(原始文件也是如此,但至少您可以让它正确地与
xargs一起工作,但不能与此一起工作)。谢谢!但是|是否也接受最后一个命令的stdout并将其作为stdin传递给下一个命令?你能告诉我新命令应该是什么样子吗?我似乎无法让它工作。