[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::foreachDir::entries( Dir::each_childDir::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