Ruby脚本:根据不同的名称将文件从一个文件夹复制到多个其他文件夹

Ruby脚本:根据不同的名称将文件从一个文件夹复制到多个其他文件夹,ruby,matrix,directory,copy,identifier,Ruby,Matrix,Directory,Copy,Identifier,我对编程和编码非常陌生,最近开始学习Ruby。我的问题是: 我在一个文件夹中有一堆文件(大约400个),每个文件都有标识符,可以将它们分成4个单独的组。我希望能够编写一个脚本来查看此文件夹,识别4个不同组中的文件,然后将文件复制到以标识符命名的四个单独文件夹中。这可能吗? 如果是这样,那么是否可以根据文件夹中哪个标识符可以重叠的矩阵将文件复制到不同的文件夹中 例如,假设每个文件属于四个不同的人:鲍勃、哈里、汤姆、史蒂夫。(它们充当文件末尾的标识符) 鲍勃可以从他自己和哈利那里得到文件,但不能从另

我对编程和编码非常陌生,最近开始学习Ruby。我的问题是:

我在一个文件夹中有一堆文件(大约400个),每个文件都有标识符,可以将它们分成4个单独的组。我希望能够编写一个脚本来查看此文件夹,识别4个不同组中的文件,然后将文件复制到以标识符命名的四个单独文件夹中。这可能吗?

如果是这样,那么是否可以根据文件夹中哪个标识符可以重叠的矩阵将文件复制到不同的文件夹中

例如,假设每个文件属于四个不同的人:鲍勃、哈里、汤姆、史蒂夫。(它们充当文件末尾的标识符)

  • 鲍勃可以从他自己和哈利那里得到文件,但不能从另外两个人那里得到
  • 哈利可以从他自己、鲍勃、汤姆那里得到文件,但史蒂夫没有
  • 汤姆可以从哈利和史蒂夫那里得到文件,但鲍勃没有
  • 史蒂夫可以从他自己和汤姆那里得到文件,但不能从另外两个人那里得到
  • 我可以写一个脚本来查看这些文件并根据上面的参数将它们复制到四个不同的文件夹中吗

    如果不是在Ruby中,还有其他编程语言可以做到这一点吗


    谢谢你的帮助

    下面是一个让您开始学习的示例。我将您的测试文件修改为
    ExampleA\u Bob
    格式,以便更容易获取标识符

    要进行测试,只需将
    file\u testing.rb
    file\u owner.rb
    放在文件夹中,并使用
    ruby file\u testing.rb
    运行即可。它将生成测试文件,并根据是否允许每个人查看这些文件,将它们复制到每个人的文件夹中

    文件_testing.rb

    require "fileutils"
    require_relative "file_owner"
    
    # -----------------------------------------------------------------------------
    # ---Helper Functions----------------------------------------------------------
    # -----------------------------------------------------------------------------
    def create_test_files(directory_for_files, file_names)
      FileUtils.mkdir_p(directory_for_files)
      file_names.each{ |file_name|
        out_file = File.new("#{directory_for_files}#{file_name}", "w")
        out_file.puts("Testing #{file_name}")
        out_file.close
      }
    end
    
    def create_file_owners(file_owner_permissions, path_to_files)
      file_owners = []
      file_owner_permissions.each{ |owner_name, owner_permissions|
        file_owners.push(FileOwner.new(owner_name.to_s, owner_permissions, path_to_files))
      }
    
      return file_owners
    end
    
    def parse_file_identifier(file_name)
      split_name = file_name.split("_")
      return split_name[-1]
    end
    
    def sort_files(file_owners, path_to_files)
      Dir.foreach(path_to_files) do |file|
        next if file == "." or file == ".."
        next if File.directory?(path_to_files + file)
    
        file_owners.each{ |owner|
          file_identifier = parse_file_identifier(file)
          owner.copy_file_if_allowed(path_to_files + file, file_identifier)
        }
      end
    end
    
    # -----------------------------------------------------------------------------
    # ---Main----------------------------------------------------------------------
    # -----------------------------------------------------------------------------
    path_to_files = "./test_files/"
    file_names = ["ExampleA_Bob", "ExampleB_Bob", "ExampleC_Bob", "ExampleA_Harry", "ExampleB_Harry", "ExampleC_Harry", "ExampleA_Tom", "ExampleB_Tom", "ExampleC_Tom", "ExampleA_Steve", "ExampleB_Steve", "ExampleC_Steve"]
    create_test_files(path_to_files, file_names)
    
    file_owner_permissions = {
      "Bob": ["Harry"],
      "Harry": ["Bob", "Tom"],
      "Tom": ["Harry", "Steve"],
      "Steve": ["Tom"]
    }
    file_owners = create_file_owners(file_owner_permissions, path_to_files)
    sort_files(file_owners, path_to_files)
    
    文件_owner.rb

    require 'fileutils'
    class FileOwner
      attr_accessor :name
      attr_accessor :permissions
    
      def initialize(name, permissions, path_to_files)
        @name = name
        @permissions = permissions.push(name)
        @personal_folder = path_to_files + name
        ensure_personal_folder_exists()
      end
    
      public
      def copy_file_if_allowed(file_path, file_identifier)
        if @permissions.include? file_identifier
          add_file_to_personal_folder(file_path)
        end
      end
    
      private
      def ensure_personal_folder_exists()
        FileUtils.mkdir_p(@personal_folder)
      end
    
      def add_file_to_personal_folder(file_path)
        FileUtils.cp(file_path, @personal_folder)
      end
    end
    

    下面是一个让您开始学习的示例。我将您的测试文件修改为
    ExampleA\u Bob
    格式,以便更容易获取标识符

    要进行测试,只需将
    file\u testing.rb
    file\u owner.rb
    放在文件夹中,并使用
    ruby file\u testing.rb
    运行即可。它将生成测试文件,并根据是否允许每个人查看这些文件,将它们复制到每个人的文件夹中

    文件_testing.rb

    require "fileutils"
    require_relative "file_owner"
    
    # -----------------------------------------------------------------------------
    # ---Helper Functions----------------------------------------------------------
    # -----------------------------------------------------------------------------
    def create_test_files(directory_for_files, file_names)
      FileUtils.mkdir_p(directory_for_files)
      file_names.each{ |file_name|
        out_file = File.new("#{directory_for_files}#{file_name}", "w")
        out_file.puts("Testing #{file_name}")
        out_file.close
      }
    end
    
    def create_file_owners(file_owner_permissions, path_to_files)
      file_owners = []
      file_owner_permissions.each{ |owner_name, owner_permissions|
        file_owners.push(FileOwner.new(owner_name.to_s, owner_permissions, path_to_files))
      }
    
      return file_owners
    end
    
    def parse_file_identifier(file_name)
      split_name = file_name.split("_")
      return split_name[-1]
    end
    
    def sort_files(file_owners, path_to_files)
      Dir.foreach(path_to_files) do |file|
        next if file == "." or file == ".."
        next if File.directory?(path_to_files + file)
    
        file_owners.each{ |owner|
          file_identifier = parse_file_identifier(file)
          owner.copy_file_if_allowed(path_to_files + file, file_identifier)
        }
      end
    end
    
    # -----------------------------------------------------------------------------
    # ---Main----------------------------------------------------------------------
    # -----------------------------------------------------------------------------
    path_to_files = "./test_files/"
    file_names = ["ExampleA_Bob", "ExampleB_Bob", "ExampleC_Bob", "ExampleA_Harry", "ExampleB_Harry", "ExampleC_Harry", "ExampleA_Tom", "ExampleB_Tom", "ExampleC_Tom", "ExampleA_Steve", "ExampleB_Steve", "ExampleC_Steve"]
    create_test_files(path_to_files, file_names)
    
    file_owner_permissions = {
      "Bob": ["Harry"],
      "Harry": ["Bob", "Tom"],
      "Tom": ["Harry", "Steve"],
      "Steve": ["Tom"]
    }
    file_owners = create_file_owners(file_owner_permissions, path_to_files)
    sort_files(file_owners, path_to_files)
    
    文件_owner.rb

    require 'fileutils'
    class FileOwner
      attr_accessor :name
      attr_accessor :permissions
    
      def initialize(name, permissions, path_to_files)
        @name = name
        @permissions = permissions.push(name)
        @personal_folder = path_to_files + name
        ensure_personal_folder_exists()
      end
    
      public
      def copy_file_if_allowed(file_path, file_identifier)
        if @permissions.include? file_identifier
          add_file_to_personal_folder(file_path)
        end
      end
    
      private
      def ensure_personal_folder_exists()
        FileUtils.mkdir_p(@personal_folder)
      end
    
      def add_file_to_personal_folder(file_path)
        FileUtils.cp(file_path, @personal_folder)
      end
    end
    

    这可能吗?对要获得具体帮助,您可能需要提供一些文件名、标识符和预期结果的具体示例。这可能吗?对要获得具体帮助,您可能需要提供一些文件名、标识符和预期结果的具体示例。