Вы очень близки в своем сценарии, но хотите удалить дубликаты; то есть 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 )), но может подойти для ваших нужд.
Да, может, и это явно учитывается в библиотеке подстановок:
/* 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
структуре, которая формирует связанный список, сохраняя только указатель на следующую запись и указатель на строку.