使用构造函数遍历目录打印输出到文件

时间:2014-09-07 18:32:36

标签: ruby ubuntu

好的,所以我涉猎java,C ++,python,BASIC,shell,PERL和批处理...我试图以递归方式遍历目录,将输出保存到日志文件中供以后查看。然而,我遇到了类构造的问题,以便为实际程序添加一些智能和更多控制我正在运行Ubuntu 14并使用ruby 2.0.0现在我很喜欢ruby noob但我试着直接跳进就像我对批次和所有其他人一样。这是我得到的错误:

  

test.rb:9:语法错误,意外的tIVAR,期待')'@ watch =   看            ^ test.rb:17:语法错误,意外的keyword_then,期待keyword_end File.file?(f)然后是“F”                         ^ test.rb:18:语法错误,意外的keyword_then,期待keyword_end File.directory?(f)然后“D”                              ^ test.rb:19:语法错误,意外的keyword_else,期待keyword_end else“?”           ^ test.rb:28:语法错误,意外$ end,期待keyword_end

这是我试图构建的代码:

#!/bin/ruby
require 'find'
class MegaWatch
attr_accessor :written

#create a place holder in a file to log to about
#new files written to the disk.
def initialize(watch = Find.find('./')  
 @watch = watch
end

def search_dir
if @watch.nil?
puts "is empty!"
elsif @watch.responds_to?("type")
@watch.each do |watch|
  File.file?(f) then "F"
  File.directory?(f) then "D"
  else "?"
  end
end

if __FILE__ == $0
go = MegaWatch.new
go.search_dir = "/bin/"
end

任何帮助都会被爱!我这样做的原因是因为我在我的磁盘上发现了几个.... shotty文件,我想在我的系统上添加更多的命令和控制权。如果在任何建议中有一种更容易的语言可以做到这一点会非常受欢迎,只有批量转换的真正专业知识才有点......很难。

2 个答案:

答案 0 :(得分:0)

您遇到的问题是,在ruby中,与其他语言不同,您不使用此“if”格式:

if arg then
    exp
elseif arg then
    exp
end

相反,ruby使用以下格式:

if arg
   exp
elseif arg
   exp
end

此外,您的部分代码也没有。

  1. 在“初始化”方法中,您忘记了封闭的括号。
  2. 在@ watch.each循环中,您忘记关闭循环。添加“结束” 在你的其他陈述之前
  3. 尝试清理代码,缩进可以帮助您 其他人阅读并理解您的代码;特别是在要求时 帮助。
  4. 我不是100%肯定你想要做什么,但如果你是 试图根据文件或目录的类型返回一个字母 被拉,然后尝试这个代码。

    Path = "C:/users/owner/desktop" 
    @array_files = Array.new
    @array_directories = Array.new
    
    def search_dir path
    
        Dir.foreach(path).each do |filename|
            @array_files << filename if File.file?(filename)
            @array_directories << filename if File.directory?(filename)
        end
    
        return @array_files, @array_directories
    
    end
    
    
    puts search_dir Path
    
  5. 至于确定文件是否是今天制作的,你可能会遇到麻烦。 在不同的平台上,创建时间的存储方式不同。不过这里是如何在Windows上做到这一点。附:这不是最好的代码块,可以针对速度,资源,效率,可读性和稳健性进行修改;但是,我只是想让你走上正确的道路。您可能希望将部分拆分为方法或类以更好地编写代码。

    require 'date'
    Path = "your/path/here"
    @today = Date.today.strftime('%Y-%m-%d')
    files_today = []
    users = []
        Dir.foreach(Path) do |filename| 
            files_today << filename if (/(\d{4}-\d{2}-\d{2})/.match(File.ctime(filename).to_s).to_s.strip == @today)
        end
    puts files_today
    

    关于第二个问题。我无法弄清楚如何务实地找到谁创建了哪些文件,但通过一些搜索,可能还有一些宝石或系统调用,你可以将工作脚本拼凑在一起。不过,这段代码应该让你开始获取用户列表来比较文件创建者! *您可能需要添加到您不想查找的用户列表中。

    users = []
        Dir.foreach("C:/Users")do |username|
            users << username if !username.match /[.|..]/
        end
    puts users
    

答案 1 :(得分:0)

ok @schylar所以我给了他一个机会。它导致了一个实际的日志供我查看。然而,现在更多的问题。当我设置要观看的路径时,它所做的只是打印脚本的输出为/ bin / im试图找到改变它的方法。这是我现在使用的代码。

require 'date'
require 'time'

print "which directory?"
Path = gets.to_s
@today = Date.today.strftime('%Y-%m-%d')
files_today = Path
users = []
output = File.open("./directory_log.txt","w")
    Dir.foreach(Path) do |filename| 
        files_today << filename if (/(\d{4}-\d{2}-\d{2})/.to_s.strip == @today)
    end
output << files_today
好的,所以我做了大量的挖掘工作,感谢stackoverflow在您的页面中提供了大量的知识!我爱你哈哈。但这是我最终使用的代码:

require 'date'
require 'time'

Path = "/"
@today = Date.today.strftime('%Y-%m-%d')
files_today = Dir['*'].sort_by{|f| File.mtime(f)} + Path.split(',')
users = "root, guest"
output = File.open("./directory_log.txt","a")

    Dir.foreach(Path) do |filename| 
        files_today << filename if (/(\d{4}-\d{2}-\d{2})/ == @today)
    end

output << files_today
output << "\t\n\n\n\n\nScript ran at #{@today}\n"
output << "\n--------------------------------------------\n\n"
output.close

我能够从可读日志文件中的脚本中检索的输出是:

  

[“Untitled Document”,“tutorial.zip”,“java tutorial”,   “253721-bigthumbnail.jpg”,“run.pl~”,“run.pl”,“directory_log.txt~”,   “directory_log.txt”,“test.rb~”,“test.rb”,“/ bin /”]

     

脚本在2014-09-09运行

     

我想把我想出来的东西放在这里以供将来参考。再次感谢man for your pointers !!

-