Может ли у**(bash globstar )не хватить памяти?

Вы очень близки в своем сценарии, но хотите удалить дубликаты; то есть a -b считается дубликатом b -a.

Мы можем использовать неравенство, чтобы справиться с этим; отображать имя файла только в том случае, если первый файл предшествует второму файлу в алфавитном порядке. Это обеспечит только одно из каждого совпадения.

for i in *.txt
do
  for j in *.txt
  do
    if [ "$i" \< "$j" ]
    then
     echo "Pairs $i and $j"
    fi
  done
done

Это дает результат

Pairs a.txt and b.txt
Pairs a.txt and c.txt
Pairs b.txt and c.txt

Это неэффективный алгоритм, (это O (n^2 )), но может подойти для ваших нужд.

5
15.03.2021, 18:00
1 ответ

Да, может, и это явно учитывается в библиотеке подстановок:

  /* Have we run out of memory?  */
  if (lose)
    {
      tmplink = 0;

      /* Here free the strings we have got.  */
      while (lastlink)
        {
          /* Since we build the list in reverse order, the first N entries
             will be allocated with malloc, if firstmalloc is set, from
             lastlink to firstmalloc. */
          if (firstmalloc)
            {
              if (lastlink == firstmalloc)
                firstmalloc = 0;
              tmplink = lastlink;
            }
          else
            tmplink = 0;
          free (lastlink->name);
          lastlink = lastlink->next;
          FREE (tmplink);
        }

      /* Don't call QUIT; here; let higher layers deal with it. */

      return ((char **)NULL);
    }

Каждая попытка выделения памяти проверяется на предмет неудачи и устанавливает loseв 1, если она не удалась. Если в оболочке заканчивается память, она завершает работу (, см. QUIT). Там нет специальной обработки, , например. переполнение на диск или обработка уже найденных файлов.

Сами по себе требования к памяти невелики, :сохраняются только имена каталогов, в globvalструктуре, которая формирует связанный список, сохраняя только указатель на следующую запись и указатель на строку.

10
18.03.2021, 22:24

Теги

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