Проверьте, является ли каталог пустым в Ruby - PullRequest
28 голосов
/ 20 февраля 2011

Как я могу проверить, является ли каталог пустым или нет в Ruby?Есть ли что-то вроде:

Dir.exists?("directory")

(я знаю, что эта функция не существует.)

Ответы [ 6 ]

48 голосов
/ 20 февраля 2011

Ruby теперь имеет Dir.empty?, что делает это тривиально простым:

Dir.empty?('your_directory') # => (true|false)

В Ruby до 2.4.0 вы можете просто получить список записей иубедитесь сами, пусто оно или нет (учитывая «.» и «..»).См. Документы .

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

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

Обновление: первый метод, описанный выше для использования регулярных выражений;теперь это не (очевидно).Комментарии ниже в основном относятся к предыдущей (регулярной) версии.

9 голосов
/ 27 декабря 2016

Начиная с Ruby 2.4.0, существует Dir.empty?

Dir.empty?('/') # => false
9 голосов
/ 20 февраля 2011

Вы можете использовать записи для просмотра всех файлов и папок в каталоге:

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

Вы также можете искать файлы, используя glob:

Dir.glob('directory/{*,.*}')
=> ['file.rb', '.git']
Dir.glob('directory/{*,.*}').empty? # Check if empty with no files.
3 голосов
/ 23 ноября 2011

Пустой каталог должен содержать только две ссылки (. И ..). На OSX это работает:

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

... но не работает на Linux или Cygwin. (Спасибо @DamianNowak) Адаптация ответа Пан:

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

должно работать.

1 голос
/ 18 февраля 2015

Не просто, но отлично работает в * nix системах.

Dir.entries(directory_path) == ['.', '..']
0 голосов
/ 17 января 2016

Вот мой шаблон для этого. К вашему сведению, я ищу определенное совпадение файлов внутри источника.

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

дайте мне знать, если что:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...