find
的输出进行排序,然后再将其输出到命令中。在之间输入| sort |
不起作用,该怎么办?find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand
#1 楼
照常使用find
,并使用NUL分隔行。 GNU sort
可以使用-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("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
评论
它似乎不适用于find。 -name'* .dat'-type f -printf'%f \ n'|排序-z | xargs -r0> output.txt。由于printf,我的行是否错误?
–本
20 Nov 24 '17:47