在终端中运行一组Ruby脚本

时间:2019-05-05 18:35:55

标签: ruby macos terminal

我想在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

1 个答案:

答案 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是“免费”获取所有内容的快速方法。