Как скопировать структуру каталогов в рубине, исключая определенные расширения файла

После трех с половиной часов борьбы я решил ее сам.

(function($) {
  $('.js-nav-menu-toggle').on('click', function() {
    $(this).parents('.navigation-menu').toggleClass('navigation-menu--open');
  });
  
  $('html').on('click', function(e) {
    if(!$(e.target).closest('.js-nav-menu').length &&
      ($('.js-nav-menu').hasClass('navigation-menu--open'))) {
        $('.js-nav-menu').removeClass('navigation-menu--open');
    }
  });
})(jQuery);
body {
  background: #000;
  font-size: 1.2em;
  color: #fff;
  height: 100vh;
}

.navigation-menu__bars, .navigation-menu__bars::before, .navigation-menu__bars::after {
  cursor: pointer;
  border-radius: 1px;
  height: 2px;
  width: 25px;
  background: #fff;
  position: absolute;
  left: 0;
  top: 50%;
  display: block;
  transition: all .3s;
}

.navigation-menu {
  background-color: transparent;
  height: 100%;
  position: fixed;
  width: 554px;
  transform: translateX(-100%);
  transition: transform .3s .3s;

  /*vk*/
  right: 0;
  transform: translateX(92%)
}
.navigation-menu::before {
  background: #4E567E;
  content: '';
  height: 400%;
  left: 50%;
  position: absolute;
  top: 0;
  transform: translate(-50%, -50%) rotate(40deg);
  width: 100%;
  z-index: 0;

  /*vk*/
  transform: translate(-43%, -50%) rotate(-40deg);
}
.navigation-menu--open {
  transform: translateX(0);
}
.navigation-menu--open .navigation-menu__bars {
  background-color: transparent;
}
.navigation-menu--open .navigation-menu__bars::before, .navigation-menu--open .navigation-menu__bars::after {
  top: 0;
}
.navigation-menu--open .navigation-menu__bars::before {
  transform: rotate(45deg);
}
.navigation-menu--open .navigation-menu__bars::after {
  transform: rotate(-45deg);
}
.navigation-menu--open .menu-list__item {
  opacity: 1;
  transition-delay: 1s;
}
.navigation-menu__toggle {
  cursor: pointer;
  height: 30px;
  position: absolute;
  /*right: -40px;*/
  top: 5px;
  width: 30px;

  /*vk*/
  z-index: 9999;
}
.navigation-menu__bars::before, .navigation-menu__bars::after {
  content: '';
}
.navigation-menu__bars::before {
  left: 0;
  top: -8px;
}
.navigation-menu__bars::after {
  left: 0;
  top: 8px;
}

.menu-list {
  padding: 60px 20px;
  position: relative;
  z-index: 10;

  /*vk*/
  width: 200px;
  position: absolute;
  right: 0;
}
.menu-list__item {
  margin: 40px 0;
  opacity: 0;
  transition: opacity .5s .5s;
}

@media only screen and (max-width: 700px) {
  .navigation-menu {
    min-width: 240px;
    width: 80%;
  }
  .navigation-menu::before {
    width: 110%;
  }
}
@media only screen and (max-width: 480px) {
  .navigation-menu {
    background-color: #4E567E;
    min-width: 240px;
    width: 80%;
  }
  .navigation-menu::before {
    transform: translate(-50%, -50%) rotate(45deg);
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<nav class="navigation-menu js-nav-menu">
  <div class="navigation-menu__toggle js-nav-menu-toggle">
    <span class="navigation-menu__bars"></span>
  </div>
  <ul class="menu-list">
    <li class="menu-list__item">Menu Item 1</li>
    <li class="menu-list__item">Menu Item 2</li>
    <li class="menu-list__item">Menu Item 3</li>
    <li class="menu-list__item">Menu Item 4</li>
    <li class="menu-list__item">Menu Item 5</li>
  </ul>
</nav>

5
задан Mike Pond 3 April 2009 в 03:53
поделиться

3 ответа

Вы могли использовать модуль находки. Вот фрагмент кода:


require "find"

ignored_extensions = [".cs",".txt"]

Find.find(path_to_directory) do |file|
  # the name of the current file is in the variable file
  # you have to test it to see if it's a dir or a file using File.directory?
  # and you can get the extension using File.extname

  # this skips over the .cs and .txt files
  next if ignored_extensions.include?(File.extname(file))
  # insert logic to handle other type of files here
  # if the file is a directory, you have to create on your destination dir
  # and if it's a regular file, you just copy it.
end
9
ответ дан 13 December 2019 в 19:36
поделиться

Возможно, используйте некоторые сценарии оболочки?

files = `find | grep -v "\.\(txt\|cs\)$"`.split
0
ответ дан 13 December 2019 в 19:36
поделиться

Я не уверен, что Ваша начальная точка, или что Вы подразумеваете под ручным обходом, но предположением, которого что Вы выполняете итерации по набору файлов, можно использовать метод отклонения для исключения объектов на основе оценки булева условия.

пример:

Dir.glob( File.join('.', '**', '*')).reject {|filename| File.extname(filename)== '.cs' }.each {|filename| do_copy_operation filename destination}

В этом примере Шарик возвращает счетный набор имен файлов (включая каталоги). Вы исключаете объекты, которые Вы не хотите в режекторном фильтре. Вы затем реализуете метод, который берет имя файла и место назначения, чтобы сделать копию.

Можно ли использовать метод массива, включают? в блоке отклонения также, вроде примера Находки от Гео-.

Dir.glob( File.join('.', '**', '*')).reject {|file| ['.cs','.txt'].include?(File.extname(file)) }
2
ответ дан 13 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: