2011-02-20 10 views
27

Ruby에서 디렉토리가 비어 있는지 확인하려면 어떻게합니까? 같은 것이 있습니다 : (. 난 그 기능이 존재하지 않는 것을 알고) Ruby에서 디렉토리가 비어 있는지 확인하십시오.

Dir.exists?("directory") 

+2

내가라는 방법을보고 싶어요이 있으면 알려 "Dir.empty을?" –

+0

@BenFlynn 5 년 후, 당신의 소원은 이루어졌습니다. (http://stackoverflow.com/a/41344613/2021397) – Janosch

+0

@Janosch 중력파의 존재를 증명하는이 증거는 2016 년에 일어나는 가장 좋은 일입니다 –

답변

46

당신은 단지 항목의 목록을하고 (이 비어 있는지 여부를 스스로 잘, 당신을 볼 수 있습니다 . "및".. "에 대해 설명해야합니다). the docs을 참조하십시오.

(Dir.entries('your_directory') - %w{ . .. }).empty? 

# or using glob, which doesn't match hidden files (like . and ..) 
Dir['your_directory/*'].empty? 

업데이트 : 위의 첫 번째 방법은 정규식을 사용하는 데 사용됩니다. 이제는 (분명히) 그렇지 않습니다. 아래의 주석은 대부분 이전 (정규식) 버전에 적용됩니다.

+0

처음에는 오류가 발생했지만 두 번째 오류는 완벽하게 처리되었습니다. 감사! –

+0

@ Mark Szymanski : 아아, 나는 괄호 안에 블록을 싸웠다. 결정된. – coreyward

+0

첫 번째 명령은 .git와 같은 숨겨진 파일도 무시합니다. –

9
당신은 디렉토리에있는 모든 파일과 폴더를 볼 항목을 사용할 수 있습니다

: 또한 단지 글로브를 사용하여 파일을 검색 할 수 있습니다

Dir.entries('directory') 
=> ['.', '..', 'file.rb', '.git'] 
Dir.entries('directory').size <= 2 # Check if empty with no files or folders. 

는 :

Dir.glob('directory/{*,.*}') 
=> ['file.rb', '.git'] 
Dir.glob('directory/{*,.*}').empty? # Check if empty with no files. 
+2

그러나'Dir.glob ('directory/*')'는'.'로 시작하는 파일을 제외합니다 (예 :').profile' 또는'.git'. –

+0

@ (mu가 너무 짧음) - 정확합니다. 숨겨진 파일을 포함하도록 정규 표현식을 업데이트했습니다. –

+3

Dir.glob ('directory /{*,.*}')는 "."을 캡처합니다. 그리고 ".."그래서 비어 있습니까? 항상 false를 반환합니다. –

3

빈 디렉토리 만이 있어야한다 링크 (. 및 ..). OSX에서 작동합니다 :

File.stat('directory').nlink == 2 

... Linux 또는 Cygwin에서는 작동하지 않지만 작동하지 않습니다. (Thanks @ DamianNowak) 팬의 대답을 적응 :

Dir.entries('directory').size == 2 

이 작동합니다.

+1

'nlink'는 하위 디렉토리의 수를 확인합니다. 이것은 틀린 것입니다. 'size'가 체크되어야합니다. – Nowaker

+0

@DamianNowak irb File.stat ('.'). nlink http://www.ruby-doc.org/core-1.9.3/File/Stat.html#method-i-nlink –

+0

시도해 보았습니다. , 그리고 ... http://pastie.org/4128736 – Nowaker

1

직설적이지는 않지만 * nix 계열의 시스템에서 완벽하게 작동합니다.

Dir.entries(directory_path) == ['.', '..'] 
0

다음은 내 템플릿입니다.이 파일에는 소스와 일치하는 특정 파일이 있습니다.

mydir = "/home/to/mydir" 

Dir.chdir(mydir) 

if Dir.entries(mydir).select(|x| x != '.' && x != '..' && x =~ /\regex.txt\z/).size > 0 


     do_something 

elsif Dir.entries(mydir).select(|x| x != '.' && x != '..' && x =~ /\regex.txt\z/).size < 0 

     do_something_else 

else 

     puts "some warning message" 
end 

나 아무것도 :)

관련 문제