Как использовать NULL (\0) в качестве разделителя в сортировке GNU

Я ищу способ сортировки результатов find правильное возвращение ряда каталогов для дальнейшей обработки в bash-скрипте. так как имена файлов не могут содержать символ NULL (\0), я подумал, что это станет отличным разделителем для результатов, передаваемых в sort,

так что это то, что я ожидал бы работать, как описано:

find ./ -maxdepth 1 -type d -iname 'xyz?' -print0 | sort -t $'\0'

но, к сожалению, я получил знакомый sort: empty tab

При поиске объяснения a натолкнулся на вопрос, приводящий к аналогичному результату, который описан как работающий нормально (см. комментарий Лукаса 26 апреля). в моем случае (с использованием GNU sort v 7.4) это выглядит иначе.

я также проверил вывод find, отправив в od -c но это только показывает, что результирующие папки разделены на NULL, как и ожидалось.

кто-нибудь здесь сталкивался с подобным сценарием и, возможно, нашел решение или объяснение, почему \ 0 кажется невозможным разделителем для сортировки?

с нетерпением жду ваших ответов...

edit: обратите внимание, что команда find используется в качестве примера здесь, более простой способ проверить / проиллюстрировать это может быть echo "g\0u\0b\0k" | sort -t $'\0'

3 ответа

Решение

-t это разделитель полей. Если вы хотите использовать \0 в качестве разделителя строк, то вам нужно использовать -z,

Для дальнейшей обработки в Bash-скрипте смотрите, например:

Захват результатов поиска. -print0 в массив bash

# cf. http://mywiki.wooledge.org/BashFAQ/020
unset a i
while IFS='' read -r -d $'\0' dir; do
   a[i++]="$dir"        # or however you want to process each directory
done < <(find ./ -maxdepth 1 -type d -iname 'xyz?' -print0 | LC_ALL=C sort -z)

printf '%s\n' "${#a[@]}"
printf '%s\n' "${a[@]}"

# btw, you may use printf to add zero bytes
printf '%c\000' g u b k | sort -z | tr '\0' ' '
printf '%s\000' g1 u2 b3 k4 | sort -z | tr '\0' ' '

Использовать -z возможность sort наборы данных с нулевым окончанием:

find ./ -maxdepth 1 -type d -iname 'xyz?' -print0 | sort -z | tr '\0' '\n'
Другие вопросы по тегам