如何获取模式匹配目录中的特定文件Ruby
How to get the specific files in pattern-matching directory Ruby
我想写一个 Ruby 脚本来查找相同模式的目录,然后将其中的文件夹和文件复制到另一个目录。
例如,如果我想找到一个目录模式:
"./file/drive_Temp/**/tools/"
可以是:
- ./file/drive_Temp/abc/tools/
- ./file/drive_Temp/def/tools/
- ./file/drive_Temp/xyz/tools/
只要前面部分以“./file/drive_Temp/”开头,以“/tools/”结尾即可。
我想做的是将所有符合上述目录模式的文件复制到一个新目录中:
以下目录中可能有一些文件,例如:
- ./file/drive_Temp/abc/tools/aaa.txt
- ./file/drive_Temp/abc/tools/bbb.txt
- ./file/drive_Temp/abc/tools/ccc.txt
- ./file/drive_Temp/def/tools/zzz.txt
- ./file/drive_Temp/def/tools/yyy.txt
- ./file/drive_Temp/def/tools/qqq.txt
- ./file/drive_Temp/xyz/tools/ttt.txt
- ./file/drive_Temp/xyz/tools/jjj.txt
这些 txt 文件将移动到名为 Tools
的目录中
这是我的代码:
if File.directory?('./file/drive_Temp/**/tools')
FileUtils.mv './file/drive_Temp/**/tools/*.*','./Tools'
end
双星号不起作用?因为无法将文件夹移动到指定的目录。或者我应该改用 glob
吗?
您可以使用 Dir
获取这些目录中的所有文件,并迭代移动每个文件,如下所示:
Dir["./file/drive_Temp/**/tools/*"].each do |file|
FileUtils.mv(file, './Tools')
end
请注意,这将替换 ./Tools
中已经存在的任何文件;如果需要避免这种行为,那么你可以在移动之前检查要移动的文件是否已经存在于.Tools
中,例如:
target_dir = "./Tools"
Dir["./file/drive_Temp/**/tools/*"].each do |file|
if File.exist?("#{target_dir}/#{File.basename(file)}")
# Handle file with duplicate name.
else
FileUtils.mv(file, target_dir)
end
end
我想写一个 Ruby 脚本来查找相同模式的目录,然后将其中的文件夹和文件复制到另一个目录。
例如,如果我想找到一个目录模式:
"./file/drive_Temp/**/tools/"
可以是:
- ./file/drive_Temp/abc/tools/
- ./file/drive_Temp/def/tools/
- ./file/drive_Temp/xyz/tools/
只要前面部分以“./file/drive_Temp/”开头,以“/tools/”结尾即可。
我想做的是将所有符合上述目录模式的文件复制到一个新目录中:
以下目录中可能有一些文件,例如:
- ./file/drive_Temp/abc/tools/aaa.txt
- ./file/drive_Temp/abc/tools/bbb.txt
- ./file/drive_Temp/abc/tools/ccc.txt
- ./file/drive_Temp/def/tools/zzz.txt
- ./file/drive_Temp/def/tools/yyy.txt
- ./file/drive_Temp/def/tools/qqq.txt
- ./file/drive_Temp/xyz/tools/ttt.txt
- ./file/drive_Temp/xyz/tools/jjj.txt
这些 txt 文件将移动到名为 Tools
的目录中这是我的代码:
if File.directory?('./file/drive_Temp/**/tools')
FileUtils.mv './file/drive_Temp/**/tools/*.*','./Tools'
end
双星号不起作用?因为无法将文件夹移动到指定的目录。或者我应该改用 glob
吗?
您可以使用 Dir
获取这些目录中的所有文件,并迭代移动每个文件,如下所示:
Dir["./file/drive_Temp/**/tools/*"].each do |file|
FileUtils.mv(file, './Tools')
end
请注意,这将替换 ./Tools
中已经存在的任何文件;如果需要避免这种行为,那么你可以在移动之前检查要移动的文件是否已经存在于.Tools
中,例如:
target_dir = "./Tools"
Dir["./file/drive_Temp/**/tools/*"].each do |file|
if File.exist?("#{target_dir}/#{File.basename(file)}")
# Handle file with duplicate name.
else
FileUtils.mv(file, target_dir)
end
end