忽略但调用格式不正确的数据:使用 bash 脚本迭代和处理文件夹 + .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 程序必须以错误(非零)状态退出才能轻松完成此操作。 例如,它应该通过调用 System.exit(1) 来终止执行。

如果您的程序确实通过其退出状态向系统报告其成功或失败,那么您可以执行以下操作:

#!/bin/bash
# The name of the directory to process is expected as the first argument.
if [ $# -lt 1 ]; then
  echo usage: $0 directory
  exit 1  
fi
# The first argument to the script is $1
if [ -e failures.txt ]; then
  rm failures.txt
fi
touch failures.txt
for f in $1/*; 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 后面的参数传递。 如果程序以非零状态退出,脚本会将失败文件的名称写入脚本当前工作目录(与指定给它的数据目录无关)中的文件failures.txt中并继续。

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

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

最新更新