루비가있는 특정 디렉토리에 존재하는 폴더 목록을 어떻게 얻습니까?
Dir.entries()
가까이 보이지만 폴더로만 제한하는 방법을 모르겠습니다.
루비가있는 특정 디렉토리에 존재하는 폴더 목록을 어떻게 얻습니까?
Dir.entries()
가까이 보이지만 폴더로만 제한하는 방법을 모르겠습니다.
답변:
Jordan은 가깝지만 예상 Dir.entries
하는 전체 경로를 반환하지 않습니다 File.directory?
. 이 시도:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
.
Dir.glob()
다른 답변에서 볼 수있는 것보다 객관적으로 더 나쁩니다. 대신에 그렇게하는 것이 좋습니다
나는 이것이 더 유용하고 사용하기 쉽다는 것을 알았습니다.
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
절대적 이라면 이 문자열도 절대적입니다.
Pathname
자동으로 제거하는 것입니다 .
, ..
같은과 proprietery 파일.DS_Store
일반적인 솔루션의 경우 사용하려는
Dir.glob(File.expand_path(path))
이것은 ~/*/
(홈 디렉토리 내의 모든 폴더) 와 같은 경로에서 작동 합니다.
Borh의 대답 과 johannes의 대답 을 결합 하여 폴더에서 디렉토리 이름을 얻는 데 매우 우아한 솔루션을 얻을 수 있습니다.
# 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 }
각 파일을 테스트하여 FileTest.directory? (file_name)
. 자세한 내용 은 FileTest 설명서를 참조하십시오 .
'.'
'..'