Как использовать 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'