通过管道传输到“sort”命令对“find -print0”的输出进行排序

通过管道传输到“sort”命令对“find -print0”的输出进行排序

find在将输出传递给命令之前,我需要能够按字母顺序对输出进行排序。进入| sort |之间不起作用,那么我该怎么办?

find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand

答案1

像往常一样使用find并用 NUL 分隔行。 GNUsort可以使用 -z 开关处理这些:

find . -print0 | sort -z | xargs -r0 yourcommand

答案2

某些版本sort有一个-z选项,允许空终止记录。

find folder1 folder2 -name "*.txt" -print0 | sort -z | xargs -r0 myCommand

此外,您还可以编写一个高级脚本来执行此操作:

find folder1 folder2 -name "*.txt" -print0 | python -c 'import sys; sys.stdout.write("\0".join(sorted(sys.stdin.read().split("\0"))))' | xargs -r0 myCommand

添加-r选项以xargs确保myCommand使用参数调用它。

答案3

我认为你需要-n排序标志#

按人排序:

-n, --numeric-sort
    compare according to string numerical value

编辑

print0 可能与此有关,我刚刚测试了这一点。取出 print0 ,您可以使用-z标志在排序中以 null 终止字符串

答案4

一些实现find支持直接通过-s参数进行有序遍历:

$ find -s . -name '*.json'

从FreeBSD找到手册页:

-s       Cause find to traverse the file hierarchies in lexicographical
         order, i.e., alphabetical order within each directory.  Note:
         `find -s' and `find | sort' may give different results.

相关内容