将 xargs 通过管道传输到 GNU 并行中

将 xargs 通过管道传输到 GNU 并行中

我有以下脚本,它获取某些目录的绝对路径并将它们通过管道传输到 GNU 中进行parallel压缩。我不断收到 signal 13 错误,但我不知道为什么。

find $directory -maxdepth 1 | \
grep -v "^${directory}$" | \
xargs realpath | \
parallel -j 4 zip -r ${new_directory}/{/.}.zip {}

错误是terminated with signal 13; aborting。有时不会引发错误,但输出中不存在 zip 文件new_directory

任何帮助,将不胜感激。

答案1

在解决您遇到的实际故障之前,您需要在命令中修复一些事情来处理一些极端情况

find "$directory" -maxdepth 1 -mindepth 1 -print0 | \
xargs -0 realpath | \
parallel -j 4 zip -r "$new_directory"/{/.}.zip {}

变化find有:

  • -mindepth 1- 这将排除您的顶级目录,因此您不需要命令grep -v
  • -print0- 这将解决任何文件包含空格或任何转义字符的可能问题。所有文件都将由空字符而不是新行分隔。

这就是为什么您还需要将 添加 添加-0到命令中xargs,以便它将读取由空字符分隔的输入。

进一步排除故障

如果它不能解决您的问题,您需要进一步调试。

  1. 首先,parallel完全删除该命令并检查该命令的输入是否符合预期。

  2. 如果看起来没问题,请在parallel命令中添加详细信息以准确捕获其正在执行的操作:

parallel -t -j 4 zip -r ${new_directory}/{/.}.zip {} 2> parallel.log
  • 然后您将获得它在文件中运行的命令列表parallel.log。检查zip命令是否生成正确。
  1. 如果您在日志文件中的命令列表中仍然没有看到任何异常,zip请尝试该文件中的命令:
bash -x parallel.log

在此过程中的某些时候,您必须查看在哪个阶段收到错误。

相关内容