답변:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
대신 Dir.glob(foo)
쓸 수도 있습니다 Dir[foo]
(하지만 Dir.glob
블록을 사용할 수도 있습니다.이 경우 배열을 생성하는 대신 각 경로를 생성합니다).
Dir.glob("**/")
심볼릭 링크도 원하지 않는 한 사용
File::FNM_DOTMATCH
플래그를 사용하십시오 .
Dir.glob("**/*", File::FNM_DOTMATCH)
여기에 숨겨진 디렉토리 (예 : '.test')를 다루는 솔루션이 없다고 생각합니다.
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
나에게 도움이 되었습니까
디렉토리 목록을 보려면
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)
end.select {}.flatten()
부분을 설명 할 수 있습니까 ? 나는 전체적으로 기능을 좋아합니다. 배열 배열을 생성 할 것 같습니까? 다음 elseif
과 같이 부분 을 수행 rec_path(child, file) << child.to_s
할 수 있습니까? 배열에 할당하고 문자열 배열을 얻을 수 있습니까? 감사!
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) }