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'
但遗憾的是,我得到了compaintsort:empty标签
环顾四周寻找解释时,a遇到了一个op描述为工作正常的解释(见卢卡斯4月26日的评论)。在我的例子中(使用GNU sort V7.4),这似乎是不同的
我还检查了find by piping inod-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' ' '