我想在Mac Terminal窗口中重复运行Ruby脚本,该脚本对文本文件进行文本搜索。该脚本一次可以在Terminal中一次处理每个文本文件,但是我想对一系列文件执行多次。
我尝试在automator中创建脚本,但是没有运气。作为参考,Ruby脚本已附加,但这不是问题
谢谢
#!/usr/bin/env ruby
require 'yaml'
require 'csv'
abort "You must specify one or more files to search." if ARGV.size == 0
search_terms = "---
:stage1:
JTSJ3:
- text term 1
:stage2n:
JTSJ3:
- nothing
:stage2p:
JTSJ3:
- text term 2
:stage3:
JTSJ3:
- nothing"
...
File.open(File.join(result_dir, 'results_stage3.yml'), 'w') do |f|
f.write stage3_results.to_yaml
end
File.open(File.join(result_dir, 'results_stage3.csv'), 'w') do |f|
f.write csv_header.to_csv
stage3_results.each do |r|
f.write [ r[:category], r[:term], r[:line], r[:text], r[:file] ].to_csv
end
end
答案 0 :(得分:0)
您可以在此处使用一些模式,但是要使用这些技术,关键是定义一个简单的入口点方法,您可以根据需要调用该方法,而不是将所有内容仅散布在main
名称空间中
从ARGV
参数列表中拉出文件名:
ARGV.each do |file|
process(file)
end
您可以使用File.basename(file, '.yml')
剥离扩展名,并根据需要将其切换为.csv
。保持您的方法尽可能通用。
第二,您可以在外部使用xargs
:
find . -name '*.yml' | xargs ruby program.rb
将与该模式匹配的所有文件附加为程序的参数的位置。您甚至可以调整并行运行的选项:
find . -name '*.yml' | xargs -n 2 -p 8 ruby program.rb
运行8个并行进程(-p 8
),每个进程最多处理两个文件(-n 2
)。
您也可以自己执行以下操作:
Dir.glob('source_dir/**/*.yml') do |file|
process(file)
end
Dir.glob
擅长查找很多东西。要并行化,您可以使用线程或派生。 xargs
是“免费”获取所有内容的快速方法。