忽略但召回格式错误的数据:使用 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 程序中,这样您可以在同一个虚拟机中处理所有文件。
有一个装满文件的文件夹 - 每个文件都包含一些我需要转换为单个输出文件的数据。
我已经构建了一个转换脚本 - 它可以 运行 像这样:
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 程序中,这样您可以在同一个虚拟机中处理所有文件。