Как использовать NULL (\ 0) в качестве разделителя в сортировке GNU - PullRequest
13 голосов
/ 03 июля 2011

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

14 голосов
/ 03 июля 2011

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

3 голосов
/ 04 июля 2011

Для дальнейшей обработки в скрипте 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' ' '
1 голос
/ 03 июля 2011

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

find ./ -maxdepth 1 -type d -iname 'xyz?' -print0 | sort -z | tr '\0' '\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...