草庐IT

Ruby on rails跨平台win/linux脚本

coder 2024-06-13 原文

我想使用 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/

有关Ruby on rails跨平台win/linux脚本的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //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

  4. ruby - 确定 ruby​​ 脚本是否已经在运行 - 2

    有没有一种简单的方法可以判断ruby​​脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免

  5. ruby - ruby 脚本可以预编译成二进制文件吗? - 2

    我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby​​2exe项目可以编译在Windows上运行的ruby​​脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://

  6. ruby-on-rails - Ruby 从 bash 脚本执行中捕获 stderr 输出 - 2

    我目前可以将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]

  7. ruby - 是否可以从 ruby​​ 脚本返回值并在 c 或 shell 脚本中读取该值? - 2

    我们如何从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脚本只打印这个变量(有更多复杂的方

  8. ruby - 从 FaSTLane 将环境变量传递给 shell 脚本 - 2

    我在跑Fastlane(适用于iOS的持续构建工具)以执行用于解密文件的自定义shell脚本。这是命令。sh"./decrypt.shENV['ENCRYPTION_P12']"我想不出将环境变量传递给该脚本的方法。显然,如果我将密码硬编码到脚本中,它就可以正常工作。sh"./decrypt.shmypwd"有什么建议吗? 最佳答案 从直接Shell中扩展假设这里的sh是一个faSTLane命令,它以给定的参数作为脚本文本调用shell命令:#asafastlanedirectivesh'./decrypt.sh"$ENCRYPTI

  9. ruby - 从 ruby​​ 调用时返回 shell 脚本的状态值? - 2

    我希望这些值匹配。当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(来

  10. ruby - 如何将 Ruby 脚本变成 bash 命令? - 2

    我有一个Ruby文件,我将它作为rubyfile.rb"parameters"运行。我更喜欢将它作为regtask参数运行,而不必每次都包含ruby和文件名。我希望它与ls处于同一级别。我将如何做到这一点? 最佳答案 编辑你的文件,确保这是第一行,这样你的系统就知道如何执行你的文件:#!/usr/bin/envruby接下来,更改文件的权限以使其可执行:chmoda+xfile.rb最后,重命名并将其移动到将要执行的位置,而无需编写其完整路径:mkdir-p~/binmvfile.rb~/bin/regtask(如果~/bin存在,

随机推荐