find和xargs配合使用出现“xargs: unmatched single quote”错误[zt]

问题:

在脚本中有一句find和xargs配合使用的命令如下

1
2
3
4
5
if [ ${BACKUP_EXCLUDE} -eq 0 ]; then
  find $xdir -xdev -exec dirname "{}" \; |uniq >> ${HIS_DIR}/directories.curr
else
  find $xdir -xdev|grep -v -E "$BACKUP_EXCLUDE"|xargs -i dirname "{}"|uniq >> ${HIS_DIR}/directories.curr
fi

老是会出现“xargs: unmatched single quote”错误,检查发现是因为某些文件名有空格或其他特殊字符导致。想问一下是否有解?曾尝试过在find中使用参数”-print0″配合xargs -0,但是没法分行。高手帮忙!谢谢先!

抱歉, 我的说明不是很详细导致把各位的思路弄乱了。
首先,出现问题的语句是代码里第二个find语句
其次,该语句作用是找出所有的文件并通过管道过滤排出部分结果,然后产生找出文件的目录名,最后合并同类项输出

我曾尝试过在在find指令中加入-print0,但是无法通过grep;如果写成find … -print0 -exec grep -v -E … ”{}” \; |xargs -0 -i dirname “{}”|uniq,会出现奇怪的结果!

解决方法

对grep后的输出转换成NULL字符结尾的字符流,结合xargs -0

1
2
3
4
5
if [ ${BACKUP_EXCLUDE} -eq 0 ]; then
  find $xdir -xdev -print0 |xargs -0 -i dirname "{}" |uniq >> ${HIS_DIR}/directories.curr
else
  find $xdir -xdev|grep -v -E "$BACKUP_EXCLUDE"|tr '\n' '\0'|xargs -0 -i dirname "{}"|uniq >> ${HIS_DIR}/directories.curr
fi