使用文件名和唯一父目录初始化数组,从而消除公共目录

时间:2013-11-16 02:42:51

标签: ruby arrays

从基本目录初始化文件名​​数组后,如下所示:

mydir = Dir[Dir.pwd + '/**/*.{txt,bat}']

我正在以各种方式对数组进行排序,例如:

mydir.sort_by! {|file| File.size(file)}.reverse!

数组名称由具有完整路径名的文件组成,子目录的深度为1到3级。有没有办法初始化数组以消除驱动器和公共目录只留下文件名(带扩展名)及其唯一的父目录?在这种情况下,我想从每个阵列名称中删除以下内容:C:\ Downloads \ My Files \来实现此目的。请注意“我的文件”中的空格。

4 个答案:

答案 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) }