Форум программистов, компьютерный форум, киберфорум
Ruby
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
2 / 2 / 2
Регистрация: 18.03.2012
Сообщений: 253

Рекурсивно пройтись внутри папки по файлам

31.10.2016, 20:12. Показов 3984. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Есть задача под линуксом запустить скрипт, который должен пройтись по всем папкам и под папкам внутри указаной папки. В "конце" каждой ветки этого "дерева" папок лежат два файла (везде имена этих файлов одинаковы) с json-ом. Надо сравнивать эти два файла и писать результат в заданный файл (типа equal / non equal), и так пока не пройдемся по всем папкам .
С руби столкнулся впервые в жизни (работал до этого исключительно с C# и немного с С++) и понятия не имею как это сделать. Синтаксис ни разу не понятен.
Нашел на просторах интернета вот такую: https://gist.github.com/agius/2631752 реализацию сравнивания двух json файлов, интересует такое: могу ли я в скрипте завернуть скрипт из гита, в метод который будет вызываться внутри "моего" скрипта в цикле?
Естественно буду премного благодарен за любой код по моей теме.
Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2016, 20:12
Ответы с готовыми решениями:

Как циклом пройтись по папке с картинками, которые внутри папки в корне находятся?
Ребят подскажите пожалуйста 2 вещи 1) Как циклом пройтись по папке с картинками, которые внутри папки в корне находятся? Или 2)...

Пройтись по всем файлам в каталоге
Здравствуйте! Подскажите пожалуйста, как можно, после получения всех файлов по указанной директории, начать их обработку, путем прохождения...

Функция задания прав рекурсивно папке и файлам
Еще раз добрый вечер. Есть такая функция set_perm() { us=$(id -u $1) gr=$(id -g $2) chown ${us}.${gr} $4 chown...

2
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
01.11.2016, 11:26
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
require 'json'
 
# Пусть json находится в подпапке `fixtures` каталога скрипта,
# если скрипту не передано иное
src = ARGV.fetch 0, File.join(File.dirname(__FILE__), 'fixtures')
 
# Список подпапок хранится в массиве
dirs = [src]
# добавить рекурсивно все подпапки
dirs += Dir.glob(File.join(src, '**', '*')).select { |f| File.directory? f }
 
# Открыть файл `report-YYYYMMDD-HHMMSS.log` в текущем каталоге для записи отчета
File.open "report-#{Time.now.strftime '%Y%m%d-%H%M%S'}.log", 'w' do |report|
  # Итерация по списку папок
  dirs.each do |dir|
    # Пусть искомые файлы называются `a.json` и `b.json`
    a = File.join(dir, 'a.json')
    b = File.join(dir, 'b.json')
 
    # Если хотя бы один из файлов не найден
    unless File.exist?(a) || File.exist?(b)
      puts "JSON not found at #{dir}"
      report.puts "JSON not found at #{dir}"
      # перейти к следующему каталогу
      next
    end
 
    begin
      # Спарсить в JSON
      a = JSON.parse(File.read(a))
      b = JSON.parse(File.read(b))
    # Если ошибка во время преобразования
    rescue JSON::ParserError
      puts "Invalid JSON. Check #{a} or #{b}"
      report.puts "Invalid JSON. Check #{a} or #{b}"
      next
    # Если еще что-то произошло в IO
    rescue => e
      puts "Something gone wrong while reading #{dir}"
      report.puts "Something gone wrong while reading #{dir}"
      raise e
    end
 
    # Пусть JSON будет настолько простым, что `#==` хватит для сравнения
    puts "JSON at #{dir} #{a == b ? 'equal' : 'not equal'}"
    report.puts "JSON at #{dir} #{a == b ? 'equal' : 'not equal'}"
  end
end
Осталось дело за малым.
Написать тесты и рефакторить. Для начала: выделить в отдельные классы ответственных за просмотр каталогов, чтение файлов, сравнение JSON, записи логов, CLI.
Но лень, как всегда.
0
06.11.2016, 14:55

Не по теме:

Цитата Сообщение от j2FunOnly Посмотреть сообщение
выделить в отдельные классы ответственных за просмотр каталогов, чтение файлов, сравнение JSON, записи логов, CLI.
слишком сложно...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.11.2016, 14:55
Помогаю со студенческими работами здесь

Подсчет размера папки рекурсивно
Хочу посчитать размер папки, нашел подходящую функцию на C#, переделал ее немного, но не считает. Считает только объем файлов в корневом...

Как найти путь до папки и удалить папку внутри найденной папки
Здравствуйте, есть форма, на ней кнопка1, кнопка2 и едит, нужно сделать так чтобы при нажатии на кнопку1 программа сама находила путь к...

Вывод названия папки и пояснение к ней из файла txt внутри этой папки
Здравствуйте, дорогие друзья. Работаю над созданием одной программы и нужно сделать "движок патчей". Поясняю, это сканирование...

Поиск внутри папки и внутри файла
Добрый день, в связи с нуждами по работе начал изучать С# и нахожусь пока на начальном уровне. Нужна ваша помощь. Собственно сам вопрос: ...

Поиск по файлам и внутри файлов
Пытаюсь написать поиск всех файлов в определенной папке, далее искать во всех файлах которые менее 100 мб искать ключевое слово. Вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru