包含许多文件和子目录的目录:我需要将这些文件移动到每个子目录中,根据Ruby中的文件名

时间:2016-09-20 20:15:28

标签: ruby

我有一个包含许多文件和子目录的目录。我需要将这些文件移动到每个子目录中,具体取决于它们的命名。例如:

文件:

Folder 01 - Hello
Folder 02 - This_is_a_test
Folder 03 - Another_file_to_move

子目录:

Hello

我需要的是将名为Folder 01 - Hello的三个文件移动到文件夹This_is_a_test中;将名为Folder 02 - This_is_a_test的三个文件放入目录Another_file_to_move,将名为Folder 03 - Another_file_to_move的两个文件放入名为Folder的目录中。我有数百个文件,而不仅仅是这些文件。

可以看出,文件夹名称最后包含文件的名称,但在开头有一个\s + number +一个\s + {{ 1}} + a -。这是一种全球模式。

任何帮助?

2 个答案:

答案 0 :(得分:3)

不要急于尝试一步一步解决问题。我将通过以下步骤解决您的问题:

<强> 1。从子目录中分离文件

subdirectories, files = Dir['/path/to/the/directory/*'].partition{|path| File.directory?(path)}
# TODO ...

<强> 2。迭代文件并检索每个文件的基名,不带扩展名

subdirectories, files = Dir['/path/to/the/directory/*'].partition{|path| File.directory?(path)}

files.each do |file|
  basename = File.basename(file, '.*')
  # TODO ...
end

第3。找到该文件应转到的子目录

subdirectories, files = Dir['/path/to/the/directory/*'].partition{|path| File.directory?(path)}

files.each do |file|
  basename = File.basename(file, '.*')
  subdirectory = subdirectories.find {|d| File.basename(d) =~ /^Folder \d+ - #{Regexp.escape(basename)}$/}
  # TODO ...
end

<强> 4。将文件移动到该目录

require 'fileutils'

subdirectories, files = Dir['/path/to/the/directory/*'].partition{|path| File.directory?(path)}

files.each do |file|
  basename = File.basename(file, '.*')
  subdirectory = subdirectories.find {|d| File.basename(d) =~ /^Folder \d+ - #{Regexp.escape(basename)}$/}
  FileUtils.mv(file, subdirectory + '/')
end

完成。但是使用regexp查找子目录很昂贵,我们不希望为每个文件执行此操作。你能优化它吗?

提示1:交易记忆的时间 提示2:哈希。

答案 1 :(得分:0)

这是一个更快但不是跨平台的解决方案(假设您的工作目录是包含文件和子目录的目录),并且代码有点混乱:

subdirectories = `ls -d ./*/`.lines.each(&:chomp!)

subdirectories.each do |dir|
  basename = dir =~ /\bFolder \d+ - (\w+)\/$/ && $1
  next unless basename
  `mv ./#{basename}.* #{dir}`
end