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

时间:2011-07-03 16:15:03

标签: bash sorting

我正在寻找一种方法来排序find正确返回多个目录的结果,以便在bash脚本中进一步处理。因为文件名不能包含NULL(\ 0)字符,我认为这会为通过管道传递给sort的结果做出很好的分隔符。

所以这就是我期望的工作方式:

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

但遗憾的是我得到了sort: empty tab

寻找一个question leading to a similar result的解释,该操作被认为是正常工作(参见11月26日的卢卡斯评论)。在我的情况下(使用GNU sort v 7.4),这似乎有所不同。

我还通过管道检查了od -c的find输出,但这只显示结果文件夹按预期用NULL分隔。

有没有人遇到过类似的情况,可能会找到一个解决方案或解释为什么\ 0似乎是一个不可能的排序分隔符?

期待你的回答...

编辑请注意,此处使用find-command作为示例,更简单的方法是测试/说明这可能是echo "g\0u\0b\0k" | sort -t $'\0'

3 个答案:

答案 0 :(得分:13)

-t字段分隔符。如果您想使用\0作为分隔符,则需要使用-z

答案 1 :(得分:3)

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

Capturing output of find . -print0 into a bash array

# 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' ' '

答案 2 :(得分:1)

使用-z选项sort零终止数据集:

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