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


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.