[ruby] 루비의 디렉토리를 재귀 적으로 나열하는 한 줄?

Ruby에서 디렉토리 배열 (파일 제외)을 얻는 가장 빠르고 최적화 된 한 줄짜리 방법은 무엇입니까?

파일을 포함하는 것은 어떻습니까?



답변

Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files

대신 Dir.glob(foo)쓸 수도 있습니다 Dir[foo](하지만 Dir.glob블록을 사용할 수도 있습니다.이 경우 배열을 생성하는 대신 각 경로를 생성합니다).

Ruby Glob 문서


답변

여기에 숨겨진 디렉토리 (예 : ‘.test’)를 다루는 솔루션이 없다고 생각합니다.

require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }


답변

디렉토리 목록을 보려면

Dir['**/']

파일 목록은 더 어렵습니다. Unix 디렉토리에서도 파일이기 때문에 유형을 테스트하거나 다른 항목의 부모 인 반환 된 목록에서 항목을 제거해야합니다.

Dir['**/*'].reject {|fn| File.directory?(fn) }

그리고 모든 파일 및 디렉토리 목록을 간단히

Dir['**/*']


답변

패스트 원 라이너

디렉토리 만

`find -type d`.split("\n")

디렉토리 및 일반 파일

`find -type d -or -type f`.split("\n")`

순수한 아름다운 루비

require "pathname"

def rec_path(path, file= false)
  puts path
  path.children.collect do |child|
    if file and child.file?
      child
    elsif child.directory?
      rec_path(child, file) + [child]
    end
  end.select { |x| x }.flatten(1)
end

# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)


답변

여기에 다른 답변에서 언급했듯이 Dir.glob. 폴더에는 이상한 문자가 많이 포함될 수 있으며 glob 인수는 패턴이므로 일부 문자에는 특별한 의미가 있습니다. 따라서 다음과 같은 작업을하는 것은 안전하지 않습니다.

Dir.glob("#{folder}/**/*")

대신 다음을 수행하십시오.

Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }


답변

PHP 또는 다른 언어에서 디렉토리와 모든 하위 디렉토리의 내용을 얻으려면 몇 줄의 코드를 작성해야하지만 Ruby에서는 두 줄이 필요합니다.

require 'find'
Find.find('./') do |f| p f end

이것은 현재 디렉토리와 모든 하위 디렉토리의 내용을 인쇄합니다.

또는 더 짧게 ’**’표기법을 사용할 수 있습니다 .

p Dir['**/*.*']

동일한 결과를 얻기 위해 PHP 또는 Java로 몇 줄을 작성합니까?


답변

한 줄 솔루션은 아니지만 이것이 루비 호출을 사용하는 가장 좋은 방법이라고 생각합니다.

먼저 모든 파일을 재귀 적으로
삭제하고 두 번째는 모든 빈 디렉토리를 삭제합니다.

Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }