디렉토리의 폴더 목록 가져 오기


90

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

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

답변:


71

Jordan은 가깝지만 예상 Dir.entries하는 전체 경로를 반환하지 않습니다 File.directory?. 이 시도:

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

3
이것은 (현재 디렉토리) 및 (현재 디렉토리의 부모 ) 뿐만 아니라 숨겨진 디렉토리를 포함한 모든 디렉토리 를 가져옵니다 . 대부분의 경우 적어도이 두 개를 제거하려고합니다. '.''..'
Telemachus

나는이 하나 ... 선호 Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
빅터

그러나 .NET Framework를 사용하여 훨씬 더 명확하고 간결한 해결책을 제시했습니다 Dir.glob.
빅터

이것은 Dir.glob()다른 답변에서 볼 수있는 것보다 객관적으로 더 나쁩니다. 대신에 그렇게하는 것이 좋습니다
Dasmowenator

105

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

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

17
폴더를 되풀이하려면 **/*대신 을 사용해야 *합니다.
mkmurray

1
간단하고 최고입니다. 감사합니다
Biswajit Das

1
훌륭한 대답입니다.
레트로 리프

47

제 생각 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
rweng

3
더 간결 : Pathname.new (somepath는) .children.select (: 디렉토리?)
ablarg

19

특정 디렉토리 아래의 모든 폴더를 재귀 적으로 찾습니다.

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

비재 귀적 버전 :

Dir.glob 'certain_directory/*/'

참고 : Dir.[]같은 작품 Dir.glob.


동일한 논리를 사용하여 재귀 및 비 재귀 파일을 어떻게 찾을 수 있습니까? 그리고 얼마나 재귀적이고 비 재귀적인 파일 및 폴더입니까?
픽셀

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

4

당신은 사용할 수 있습니다 File.directory?으로부터 FileTest파일이 디렉토리인지 여부를 알아 모듈. 이것을 결합하면 Dir.entries멋진 라이너가됩니다.

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

편집 : ScottD의 수정에 따라 업데이트되었습니다.


3

이것으로, 당신은 배열을 얻을 수 있습니다 재귀적인 방법 으로 당신의 디렉토리 , subdirectories , subsubdirectories 에 대한 전체 경로 . 이 코드를 사용하여 이러한 파일을 파일 안에로드했습니다 config/application.

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

또한 우리는 지루한 다룰 필요가 없습니다 ...더 이상. 그 (것)들을 다루기 위하여 받아 들여진 대답이 필요했습니다.



1
$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

1

일반적인 솔루션의 경우 사용하려는

Dir.glob(File.expand_path(path))

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


감사! 이것은 매우 도움이됩니다.
레트로 리프

1

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 }

1

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

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

폴더 및 파일 :

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.