문제

루비가있는 특정 디렉토리에 존재하는 폴더 목록을 어떻게 얻습니까?

Dir.entries() 가까이 보이지만 폴더로만 제한하는 방법을 모르겠습니다.

도움이 되었습니까?

해결책

요르단은 가까이 있지만 Dir.entries 전체 경로를 반환하지 않습니다 File.directory? 기대합니다. 이 시도:

 Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }

다른 팁

나는 이것을 더 유용하고 사용하기 쉽다는 것을 알았습니다.

Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}

현재 디렉토리에 모든 폴더를 가져오고 제외 . 그리고 ...

폴더를 되 찾으려면 간단하게 사용합니다 ** 대신에 *.

그만큼 Dir.glob 라인을 전달할 수도 있습니다 Dir.chdir 블록으로 :

Dir.chdir('/destination directory') do
  Dir.glob('*').select { |f| File.directory? f }
end

제 생각에는 Pathname 일반 문자열보다 파일 이름에 훨씬 더 적합합니다.

require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }

이것은 해당 디렉토리의 모든 디렉토리 배열을 PathName 객체로 제공합니다.

줄을 갖고 싶다면

Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }

만약에 directory_name 절대적으로,이 문자열도 절대적입니다.

특정 디렉토리에서 모든 폴더를 재귀 적으로 찾으십시오.

Dir.glob 'certain_directory/**/*/'

비 수상 버전 :

Dir.glob 'certain_directory/*/'

메모: Dir.[] 작동합니다 Dir.glob.

당신이 사용할 수있는 File.directory? ~로부터 FileTest 파일이 디렉토리인지 확인하는 모듈. 이것을 결합합니다 Dir.entries 좋은 사람 (ish)-라이너를 만듭니다 :

directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory? File.join(directory, file}

편집하다: SCOTTD의 수정 당 업데이트.

directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}

이것으로, 당신은 A의 배열을 얻을 수 있습니다. 전체 경로 너의 ~에게 디렉토리, 하위 디렉터, 하위 하부 재귀적인 방식으로. 이 코드를 사용하여 이러한 파일을 내부에로드했습니다. config/application 파일.

Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }

또한 우리는 지루한 거래를 할 필요가 없습니다 . 그리고 .. 더 이상. 받아 들여진 답변은 그들을 다루기 위해 필요했습니다.

Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
$dir_target = "/Users/david/Movies/Camtasia 2/AzureMobileServices.cmproj/media"

Dir.glob("#{$dir_target}/**/*").each do |f| 
  if File.directory?(f)
    puts "#{f}\n"
  end
end

일반적인 솔루션의 경우 사용하고 싶을 것입니다

Dir.glob(File.expand_path(path))

이것은 경로와 같은 경로와 함께 작동합니다 ~/*/ (홈 디렉토리 내의 모든 폴더).

폴더 만 ( '.'및 '..'만 제외) : :

Dir.glob(File.join(path, "*", File::SEPARATOR))

폴더 및 파일 :

Dir.glob(File.join(path, "*"))

각 파일을 테스트하여 디렉토리인지 확인할 수 있다고 생각합니다. FileTest.directory? (file_name). 보다 Filetest에 대한 문서 더 많은 정보를 위해서.

우리는 결합 할 수 있습니다 Borh의 대답 그리고 요하네스의 대답 폴더에서 디렉토리 이름을 얻는 데 매우 우아한 솔루션을 얻으려면.

# user globbing to get a list of directories for a path
base_dir_path = ''
directory_paths = Dir.glob(File.join(base_dir_path, '*', ''))

# or recursive version:
directory_paths = Dir.glob(File.join(base_dir_path, '**', '*', ''))

# cast to Pathname
directories = directory_paths.collect {|path| Pathname.new(path) }

# return the basename of the directories
directory_names = directories.collect {|dir| dir.basename.to_s }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top