디렉토리에서 폴더 목록을 가져옵니다
-
19-09-2019 - |
문제
루비가있는 특정 디렉토리에 존재하는 폴더 목록을 어떻게 얻습니까?
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 }