我需要能够先按字母顺序对find的输出进行排序,然后再将其输出到命令中。在之间输入| sort |不起作用,该怎么办?

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


#1 楼

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

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


评论


它似乎不适用于find。 -name'* .dat'-type f -printf'%f \ n'|排序-z | xargs -r0> output.txt。由于printf,我的行是否错误?

–本
20 Nov 24 '17:47

#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("q4312078q".join(sorted(sys.stdin.read().split("q4312078q"))))' | xargs -r0 myCommand


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

评论


好一个(两个?)...有趣的是,这两个方法都可以处理。不同的是...使用排序时,它会出现在列表的末尾...使用python时,它会排序到顶部。 (也许python用LC_COLLATE = C排序)

– Peter.O
2012年3月16日14:45



还有用于排序的-t \ 0选项(这是-z同义词)

–哈维尔
15年8月10日在18:44

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

–syntaxerror
15年11月20日在19:57



@syntaxerror:在xargs中使用sh -c有什么问题? printf%s \\ n a b c d e | xargs -n3 sh -c'printf%s,“ $ @”; printf \\ n'x

–罗杰·佩特
16年8月24日在18:11



-t \ 0与-z不同。 -t用于字段分隔符,而不用于行定界符。

–灰狼
20年1月22日在15:05

#3 楼

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

根据人的排序:

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


edit

print0可能与此有关,我刚刚对此进行了测试。取出print0,您可以使用-z标志
使终止的字符串无效

评论


好吧,不幸的是,那个print0似乎是用空格分隔的文件名,这是我需要传递给命令的内容

–工业
2012年3月16日10:46



#4 楼

如果您已安装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的理由是什么?要加快速度吗?

– Peter Mortensen
2014年9月28日在0:18

这样,您就不必弄乱\ 0分离的记录。

–奥雷·丹吉(Ole Tange)
2014年9月28日下午16:46

我不明白那句话。我在文件名中创建一个带有换行符的文件并执行您的命令:cd / tmp &&触摸$'a \ nz'&& ls &&查找-maxdepth 1 -print |排序并行回声。错误输出总数。我现在知道GNU Parallel,但是那个答案错过了最初的问题,不是吗?

–uav
20年6月11日在14:49

我知道在文件名中使用疯狂字符是不好的做法-我已经在空格中添加了。我只是看到parallel具有-0参数。真好没有下注。查找-maxdepth 1 -print0 |排序-z |并行-0回显。

–uav
20年6月11日在15:01

@uav在我25年的sysadmin生涯中,我从未见过用户使用\ n制作文件。我已经看到很多带有'和'的文件。因此,除非您有邪恶的用户或错误的文件系统,否则我认为您不会遇到sysadm以外的\ n文件。

–奥雷·丹吉(Ole Tange)
20年6月11日在20:46