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

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

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

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

но, к сожалению, я получил compaint sort: empty tab

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

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

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

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

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

Ответ 1

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

Ответ 2

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

Захват вывода поиска. -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' ' '

Ответ 3

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

find ./ -maxdepth 1 -type d -iname 'xyz?' -print0 | sort -z | tr '\0' '\n'