忽略但召回格式错误的数据:使用 bash 脚本 + .jar 迭代和处理文件夹

ignore but recall malformed data : iterate & process folder with bash script + .jar

有一个装满文件的文件夹 - 每个文件都包含一些我需要转换为单个输出文件的数据。

我已经构建了一个转换脚本 - 它可以 运行 像这样:

java -jar tableGenerator.jar -inputfile more-adzuna-jobs-type-9.rdf -skillNames skillNames.ttl -countries countries_europe.rdf -outputcsv out.csv

问题是 - 一些文件包含被我的 .jar 文件视为无效的字符,有没有办法为 运行 这个命令创建一个 bash 脚本同时在一个充满这些文件(数百个)的文件夹中,并且对于每个产生错误的文件:

这似乎是可行的,但我的 bash-fu 很弱-执行此任务的合乎逻辑的方法是什么?

如果您的 Java 程序实际上以错误状态退出,那么编写一个 bash 脚本来处理文件夹中的所有文件并跟踪有错误的文件应该相当容易。我强调 Java 程序必须以错误 (non-zero) 状态退出,这很容易。例如,它应该通过调用 System.exit(1).

来终止执行

如果您的程序确实通过其退出状态向系统报告其成功或失败,那么您可能会这样做:

#!/bin/bash

# The name of the directory to process is expected as the first argument.
if [ $# -lt 1 ]; then
  echo usage: [=10=] directory
  exit 1  
fi

# The first argument to the script is 

if [ -e failures.txt ]; then
  rm failures.txt
fi

touch failures.txt

for f in /*; do
  if ! java -jar /path/to/tableGenerator.jar \
      -inputfile $f \
      -skillNames /path/to/skillNames.ttl \
      -countries /path/to/countries_europe.rdf \
      -outputcsv $f.out.csv
  then
    echo $f >> failures.txt
  fi
done

遍历第一个脚本参数指定的目录中的所有文件,依次将每个路径分配给 shell 变量 $f,并且 运行 是您的 Java 程序,将路径作为 -inputfile 之后的参数传递。如果程序以 non-zero 状态退出,脚本将失败文件的名称写入脚本当前工作目录(与指定给它的数据目录无关)的文件 failures.txt 中并继续.

请注意,它不会 运行 同时对所有文件执行命令,而是迭代执行。我不确定这是否是您请求的关键组成部分。因为你 运行 这个系统不太可能有一个单独的核心,它可以专用于你的程序的数百个实例中的每一个,而且文件所在的存储介质可能只有一个数据通道,无论如何,您无法同时有效 运行 命令数百次。

如果您确实想 运行 并行执行多个作业,那么 bash 有办法做到这一点,但我建议先让串行脚本工作。如果串行处理文件不够好,那么您可以探索实现某种并行性的方法。但是,就 Java VM 启动时间可能会在启动数百个 JVM 时出现问题而言,您最好直接将 multiple-file 处理构建到您的 Java 程序中,这样您可以在同一个虚拟机中处理所有文件。