[ruby] 하나의 디렉토리에있는 모든 파일을 반복
루비로 루프를 작성하여 각 파일에서 코드 블록을 실행할 수 있습니까?
나는 루비를 처음 접했고 이것을 수행하는 방법은 각 루프를 수행한다는 결론을 내렸다.
루비 파일은 반복하려는 디렉토리와 다른 디렉토리에서 실행됩니다.
시도했지만 Dir.foreach
작동하지 못했습니다.
답변
다른 사람들이 말했듯 Dir::foreach
이 여기에 좋은 옵션입니다. 그러나 노트는 것을 Dir::foreach
그리고 Dir::entries
항상 포함 .
하고 ..
(현재 부모 디렉토리). 일반적으로 그들에 대해 작업하고 싶지 않기 때문에 Dir::each_child
또는 Dir::children
( ma11hew28 에서 제안한대로 ) 다음과 같이 할 수 있습니다.
Dir.foreach('/path/to/dir') do |filename|
next if filename == '.' or filename == '..'
# Do work on the remaining files & directories
end
Dir::foreach
및 Dir::entries
( Dir::each_child
및 Dir::children
)에도 숨겨진 파일 및 디렉토리가 포함됩니다. 종종 이것이 당신이 원하는 것이지만, 그렇지 않은 경우에는 건너 뛰기 위해 무언가를해야합니다.
또는 Dir::glob
간단한 와일드 카드 일치를 제공하는 것을 살펴볼 수도 있습니다 .
Dir.glob('/path/to/dir/*.rb') do |rb_filename|
# Do work on files & directories ending in .rb
end
답변
이것은 읽기 쉬운 가장 좋아하는 방법입니다.
Dir.glob("*/*.txt") do |my_text_file|
puts "working on: #{my_text_file}..."
end
하위 디렉토리의 모든 파일에서 작동하도록 이것을 확장 할 수도 있습니다.
Dir.glob("**/*.txt") do |my_text_file| # note one extra "*"
puts "working on: #{my_text_file}..."
end
답변
Dir은 또한 디렉토리에서 모든 파일의 배열을 얻기 위해 더 짧은 구문을 가지고 있습니다.
Dir['dir/to/files/*'].each do |fname|
# do something with fname
end
답변
Dir.foreach("/home/mydir") do |fname|
puts fname
end
답변
찾기 라이브러리는이 작업을 위해 특별히 설계되었습니다 :
https://ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html
require 'find'
Find.find(path) do |file|
# process
end
이것은 표준 루비 라이브러리이므로 사용 가능해야합니다.
답변
나는 위에서 언급하지 않은이 것을 좋아합니다.
require 'pathname'
Pathname.new('/my/dir').children.each do |path|
puts path
end
장점은 문자열 대신 Pathname 객체를 가져 와서 유용한 작업을 수행하고 더 많이 탐색 할 수 있다는 것입니다.
답변
Dir.new('/my/dir').each do |name|
...
end