对“查找”的输出进行排序?


77

在将其find通过管道传递给命令之前,我需要能够按字母顺序对输出进行排序。| sort |在两者之间输入无效,那么我该怎么办?

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

Answers:


52

find照常使用,并使用NUL分隔行。GNU sort可以使用-z开关处理这些:

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

58

的某些版本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使用参数调用该选项。


好(两个)?不过,有趣的是,这两种方法的处理方式.有所不同... sort它在列表的末尾出现...在python其顶部排序。(也许python用排序LC_COLLATE=C)
— Peter.O 2012年

还有-t \0一个排序选项(这是-z同义词)
— Javier

1
所有这些|sort解决方案的问题是您不能再使用了-exec。好的,尽管可以重写您给的声明以-exec使其与一起使用xargs,但问题是,“迷你脚本”怎么样?(sh -c ...)我不会轻易用多个命令来转换“ sh -c”迷你脚本,以便它可以使用xargs(如果可能的话,也可以)
— 语法错误

@syntaxerror:使用xargs的sh -c有什么问题?printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
— 罗杰·佩特

4

我认为您需要-n标记进行排序#

按人排序:

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

编辑

print0可能与此有关,我刚刚对此进行了测试。取出print0,您可以使用-z标记将字符串终止为空


好吧,这print0似乎是文件名之间的空格分隔,不幸的是,我需要将这些文件名传递给我的命令
— 工业版

1

如果您安装了GNU Parallel http://www.gnu.org/software/parallel/,则可以执行以下操作:

find folder1 folder2 -name "*.txt" -print | 
  sort |
  parallel myCommand

您可以通过以下方法简单地安装GNU Parallel:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

观看有关GNU Parallel的介绍性视频以了解更多信息:https : //www.youtube.com/playlist?list=PL284C9FF2488BC6D1


使用GNU Parallel的理由是什么?要加快速度吗?
— 彼得·莫滕森

这样,您就不必弄乱\ 0分离的记录。
— Ole Tange 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.