我想使用 Ruby on Rails 应用程序列出子目录中的文件/目录,但我不知道该脚本是否可以在 Linux 或 Windows 下运行。
在 linux 上这很简单,我可以做一个
`find my_path`.split("\n").each{|line| do_sthing_with_line}
在 Windows 上,等效于使用 dir 命令。但是即使在阅读了很多关于此的帖子之后,我也无法找到一种使其正常工作的方法
`dir my_path` will output a string that is recognized as ruby as utf-8, but which in reality isn't.
让它在 Windows 上运行的正确方法是什么?
有没有一种快速的方法来检查我是否在 Windows 上? on_windows? dir_command : 查找命令
编辑:有没有一种快速的方法来生成像这样的目录内容的 TreeView ?
-- rails_app
-- -- app/
-- -- -- models/
-- -- -- controllers/
-- -- -- views/
-- -- bin/
-- -- config/
etc.
最佳答案
我根本不会使用子命令。在这种情况下,内置的 Dir.glob 应该可以工作。
类似于:
Dir.glob("#{path}/**/**").each { |fileOrDir| do_something }
无论如何,您的find 是递归的,但您的dir 不是。
如果您真的想知道是否在 Windows 上运行,有一些以 Ruby 为中心的方法,但多年来我一直在检查环境中的 WINDIR 变量,例如
if ENV["WINDIR"]
puts "On Windows"
else
puts "Not Windows *probably*"
end
编辑:这是我多年前写的一个工具,它生成一棵节点树,然后以各种方式显示它们。
def usage
puts <<END
Recursive listing of files or dirs, sortable by date or size or count.
rl [-cdfnrsuv] [-p pathname] [pathname ...]
Where:
pathname = Dir or file to process; default is ".".
-c = Sort by file count; default is sort by date.
-d = List dirs only, with their contents sizes and counts.
-f = List files only, no dirs or links.
-n = Sort by name; default is sort by date.
-p = Add pathname even if it starts with "-".
-r = Reverse sort order; default order is desc, except by name is asc.
-s = Sort by size; default is sort by date.
-u = Unsorted; default is sort by date.
-v = Verbose, including type, perms, and owner.
END
exit(1)
end # usage
class Node
attr_reader :path, :stat
def load(path)
@path, @stat, @children = path, File.lstat(path), []
@stat.directory? and Dir.glob("#{path}/*", File::FNM_DOTMATCH).each { |sub_path|
sub_path[-2,2] != "/." && sub_path[-3,3] != "/.." and @children << Node.new.load(sub_path)
}
self
end
def size
@size or @size = self.stat.directory? ? (@children.inject(0) { |acc, child| acc + child.size }) : @stat.size
end
def count
@count or @count = self.stat.directory? ? (@children.inject(0) { |acc, child| acc + child.count }) : 1
end
def to_a
@children.map { |child| child.to_a }.flatten + [self]
end
end # Node
only_dirs = only_files = by_count = by_name = by_sz = verbose = false; sort = 1; paths = []
while (arg = ARGV.shift)
arg =~ /^-[^-]*[h?]/ and usage
arg =~ /^-[^-]*c/ and by_count = true
arg =~ /^-[^-]*d/ and only_dirs = true
arg =~ /^-[^-]*f/ and only_files = true
arg =~ /^-[^-]*n/ and by_name = true
arg =~ /^-[^-]*r/ and sort *= -1
arg =~ /^-[^-]*s/ and by_sz = true
arg =~ /^-[^-]*u/ and sort = 0
arg =~ /^-[^-]*v/ and verbose = true
arg =~ /^-[^-]*p/ and paths << ARGV.shift
arg !~ /^-/ and paths << arg
end
nodes = (paths.empty? ? ["."] : paths).map { |path| Node.new.load(path).to_a }.flatten
if sort != 0
if by_sz then nodes.sort! { |a, b| sort * (2 * (b.size <=> a.size) + (a.path <=> b.path)) }
elsif by_count then nodes.sort! { |a, b| sort * (2 * (b.count <=> a.count) + (a.path <=> b.path)) }
elsif by_name then nodes.sort! { |a, b| sort * (a.path <=> b.path) }
else nodes.sort! { |a, b| sort * (2 * (b.stat.mtime <=> a.stat.mtime) + (a.path <=> b.path)) }
end
end
for node in nodes
next if only_dirs && ! node.stat.directory?
next if only_files && ! node.stat.file?
puts "%s %11s %6s %s%s" % [
node.stat.mtime.strftime("%Y-%m-%d %H:%M:%S"),
node.size.to_s.reverse.gsub(/(\d{3})(?=\d)(?!\d*\.)/, "\\1,").reverse,
node.count.to_s.reverse.gsub(/(\d{3})(?=\d)(?!\d*\.)/, "\\1,").reverse,
verbose ? "%-9s %6o %4d %4d " % [:ftype, :mode, :uid, :gid].map { |v| node.stat.send(v) } : "",
node.path]
end
关于Ruby on rails跨平台win/linux脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30769350/
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
有没有一种简单的方法可以判断ruby脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免
我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby2exe项目可以编译在Windows上运行的ruby脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://
我目前可以将stdout重定向到ruby/rails中的字符串变量,只需在bash中运行命令并将结果设置为我的字符串变量,如下所示。val=%x[#{cmd}]其中cmd是表示bash命令的字符串。但是,这仅捕获stdout,因为我想捕获stderr并将其设置为ruby中的字符串——有什么想法吗? 最佳答案 简单地重定向它:val=%x[#{cmd}2>&1]如果您只想从stderr捕获输出,请在将其复制到fd2后关闭stdout的文件描述符。val=%x[#{cmd}2>&1>/dev/null]
我们如何从ruby脚本返回值?#!/usr/bin/envrubya="test"a我们如何在Ubuntu终端或java或c中访问'a'的值? 最佳答案 在ruby/python脚本中打印你的变量,然后可以通过示例从shell脚本中读取它:#!/bin/bashruby_var=$(rubymyrubyscript.rb)python_var=$(pythonmypythonscript.py)echo"$ruby_var"echo"$python_var"注意你的ruby/python脚本只打印这个变量(有更多复杂的方
我在跑Fastlane(适用于iOS的持续构建工具)以执行用于解密文件的自定义shell脚本。这是命令。sh"./decrypt.shENV['ENCRYPTION_P12']"我想不出将环境变量传递给该脚本的方法。显然,如果我将密码硬编码到脚本中,它就可以正常工作。sh"./decrypt.shmypwd"有什么建议吗? 最佳答案 从直接Shell中扩展假设这里的sh是一个faSTLane命令,它以给定的参数作为脚本文本调用shell命令:#asafastlanedirectivesh'./decrypt.sh"$ENCRYPTI
我希望这些值匹配。当shell脚本由于某些错误条件而退出时(因此返回非零值),它们不匹配。壳$?返回1,ruby$?返回256。>>%x[lskkr]ls:kkr:Nosuchfileordirectory=>"">>puts$?256=>nil>>exitHadoop:~Madcap$lskkrls:kkr:NosuchfileordirectoryHadoop:~Madcap$echo$?1 最佳答案 在Ruby中$?是一个Process::Status实例。打印$?等同于调用$?.to_s,这等同于$?.to_i.to_s(来
我有一个Ruby文件,我将它作为rubyfile.rb"parameters"运行。我更喜欢将它作为regtask参数运行,而不必每次都包含ruby和文件名。我希望它与ls处于同一级别。我将如何做到这一点? 最佳答案 编辑你的文件,确保这是第一行,这样你的系统就知道如何执行你的文件:#!/usr/bin/envruby接下来,更改文件的权限以使其可执行:chmoda+xfile.rb最后,重命名并将其移动到将要执行的位置,而无需编写其完整路径:mkdir-p~/binmvfile.rb~/bin/regtask(如果~/bin存在,