gpt4 book ai didi

ruby - 根据 Ruby 中的文件名,包含许多文件和子目录 : I need to move those files into each subdirectories, 的目录

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:42 25 4
gpt4 key购买 nike

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

文件:

Hello.doc
Hello.txt
Hello.xls
This_is_a_test.doc
This_is_a_test.txt
This_is_a_test.xls
Another_file_to_move.ppt
Another_file_to_move.indd

子目录:

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。将文件与子目录分开

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:哈希。

关于ruby - 根据 Ruby 中的文件名,包含许多文件和子目录 : I need to move those files into each subdirectories, 的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39603040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com