Bash 如何在GNU排序中使用NULL(\0)作为分隔符

Bash 如何在GNU排序中使用NULL(\0)作为分隔符,bash,sorting,Bash,Sorting,我正在寻找一种方法来对find返回的大量目录的结果进行排序,以便在bash脚本中进行进一步处理。由于文件名不能包含NULL(\0)字符,我认为这将成为传输到排序的结果的一个很好的分隔符 这就是我所期望的工作: find ./ -maxdepth 1 -type d -iname 'xyz?' -print0 | sort -t $'\0' 但遗憾的是,我得到了compaintsort:empty标签 环顾四周寻找解释时,a遇到了一个op描述为工作正常的解释(见卢卡斯4月26日的评论)。在我的例

我正在寻找一种方法来对
find
返回的大量目录的结果进行排序,以便在bash脚本中进行进一步处理。由于文件名不能包含NULL(\0)字符,我认为这将成为传输到
排序
的结果的一个很好的分隔符

这就是我所期望的工作:

find ./ -maxdepth 1 -type d -iname 'xyz?' -print0 | sort -t $'\0'
但遗憾的是,我得到了compaint
sort:empty标签

环顾四周寻找解释时,a遇到了一个op描述为工作正常的解释(见卢卡斯4月26日的评论)。在我的例子中(使用GNU sort V7.4),这似乎是不同的

我还检查了find by piping in
od-c
的输出,但这只显示结果文件夹按预期用NULL分隔

这里是否有人遇到过类似的情况,并可能找到了解决方案或解释\0似乎是无法进行排序的分隔符

期待你的回答


编辑:注意,这里使用find命令作为示例,测试/说明这一点的更简单方法是
echo“g\0u\0b\0k”| sort-t$'\0'

-t
是字段分隔符。如果要使用
\0
作为行分隔符,则需要使用
-z
使用
-z
选项对以零结尾的数据集进行排序:

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

有关Bash脚本中的进一步处理,请参见,例如:

#cf。http://mywiki.wooledge.org/BashFAQ/020
取消一个i
而IFS=''read-r-d$'\0'dir;做
[i++]=“$dir”#或您希望处理每个目录的方式

done<您的sort版本是否不支持-z选项?我使用的是5.93版本,它支持-z表示以空结尾的条目。哦,是的,它支持!我真的应该理解行分隔符和字段分隔符之间的区别!谢谢!在结尾将NULL转换为换行符是一个有趣的想法,但在我看来,如果从一开始就选择换行符作为分隔符,那么在包含换行符的文件名中会出现同样的问题……如果签出@jeff到bashFAQ的链接(非常有趣!)并发现while循环中的
IFS='
对于不意外地修剪空白是必要的。因此
IFS=
IFS='
IFS=$'\0'
在这里表示相同的东西:NUL
# 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' ' '