我有一个包含许多文件和子目录的目录。我需要将这些文件移动到每个子目录中,具体取决于它们的命名。例如:
文件:
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 -
。这是一种全球模式。
任何帮助?
答案 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