Ответ 1
-t
- разделитель полей. Если вы хотите использовать \0
в качестве разделителя строк, вам нужно использовать -z
.
Я ищу способ сортировки результатов 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'
-t
- разделитель полей. Если вы хотите использовать \0
в качестве разделителя строк, вам нужно использовать -z
.
Для дальнейшей обработки в 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' ' '
Используйте параметр -z
для sort
наборов данных с нулевым завершением:
find ./ -maxdepth 1 -type d -iname 'xyz?' -print0 | sort -z | tr '\0' '\n'