从基本目录初始化文件名数组后,如下所示:
mydir = Dir[Dir.pwd + '/**/*.{txt,bat}']
我正在以各种方式对数组进行排序,例如:
mydir.sort_by! {|file| File.size(file)}.reverse!
数组名称由具有完整路径名的文件组成,子目录的深度为1到3级。有没有办法初始化数组以消除驱动器和公共目录只留下文件名(带扩展名)及其唯一的父目录?在这种情况下,我想从每个阵列名称中删除以下内容:C:\ Downloads \ My Files \来实现此目的。请注意“我的文件”中的空格。
答案 0 :(得分:3)
如果您知道公共目录是什么,可以使用以下代码初始化数组:
mydir = Dir.chdir(Dir.pwd) { Dir['**/*.{txt,bat}'] }
所以用你的例子:
mydir = Dir.chdir('C:\Downloads\My Files') { Dir['**/*.{txt,bat}'] }
请注意,Dir.chdir(Dir.pwd) { Dir['**/*.{txt,bat}'] }
相当于Dir['**/*.{txt,bat}']
。
答案 1 :(得分:1)
Pathname类具有可能符合您需求的relative_path_from
方法。
要使用此课程,您需要:
require 'pathname'
您需要创建Pathname类的实例才能使用该方法。你可以这样做:
mydir.map{|p| Pathname.new(p)}
然后,您可以从当前目录中获取相对路径:
mydir.map{|p| Pathname.new(p).relative_path_from(Pathname.pwd)}
你说你只想要文件名。要实现此目的,您可以拒绝目录:
mydir.map{|p| Pathname.new(p).relative_path_from(Pathname.pwd)}.reject(&:directory?)
最后,您可以按照相同的方式对大小进行排序。虽然路径名确实为您提供了更短的语法:
mydir.map{|p| Pathname.new(p).relative_path_from(Pathname.pwd)}.reject(&:directory?).sort_by(&:size).reverse
这将为您提供一个Pathname对象数组,您只能使用to_s
方法获取字符串:
mydir.map{|p| Pathname.new(p).relative_path_from(Pathname.pwd)}.reject(&:directory?).sort_by(&:size).reverse.map(&:to_s)
此外,作为尺寸说明,&:method
语法是{|x| x.method}
的简写。
答案 2 :(得分:1)
以下方法检测数组中字符串的公共前缀:
class Array
def common_prefix
first, *others = self
i = 0
loop{break unless first[i] and others.all?{|s| first[i] == s[i]}; i += 1}
first[0, i]
end
end
使用此功能,您可以
common_prefix = mydir.common_prefix
mydir_without_prefix = mydir.map{|s| s.sub(common_prefix, "")}
答案 3 :(得分:0)
您可以使用File :: basename。
mydir = Dir[Dir.pwd + '/**/*.{txt,bat}']
mydir.sort_by! { |file| File.size(file) }.reverse!
files = mydir.map { |file| File.basename(file) }