Bash “为什么……”&燃气轮机&燃气轮机;out“sort-n-o out”;不是真的运行排序吗?

Bash “为什么……”&燃气轮机&燃气轮机;out“sort-n-o out”;不是真的运行排序吗?,bash,find,cut,Bash,Find,Cut,作为练习,我应该从主目录开始查找所有.c文件,计算每个文件的行数,并使用find、wc、cut和sort将排序后的输出存储在sorted_statistics.txt中。 我发现这个命令有效 find /home/user/ -type f -name "*.c" 2> /dev/null -exec wc -l {} \; | cut -f 1 -d " " | sort -n -o sorted_statistics.txt 但我不明白为什么 find /home/user/ -ty

作为练习,我应该从主目录开始查找所有.c文件,计算每个文件的行数,并使用find、wc、cut和sort将排序后的输出存储在sorted_statistics.txt中。 我发现这个命令有效

find /home/user/ -type f -name "*.c" 2> /dev/null -exec wc -l {} \; | cut -f 1 -d " " | sort -n -o sorted_statistics.txt
但我不明白为什么

find /home/user/ -type f -name "*.c" 2> /dev/null -exec wc -l {} \; | cut -f 1 -d " " >> sorted_statistics.txt | sort -n sorted_statistics.txt
在执行排序命令之前停止。
出于好奇,这是为什么?

命令的这一部分毫无意义:

cut -f 1 -d " " >> sorted_statistics.txt | sort ...
因为cut的输出被附加到文件sorted_statistics.txt中,而sort命令根本没有输出。您可能需要使用tee

cut -f 1 -d " " | tee -a sorted_statistics.txt | sort ...

tee命令将其输入发送到文件和标准输出。它就像管道中的T形接头。

命令的这一部分毫无意义:

cut -f 1 -d " " >> sorted_statistics.txt | sort ...
因为cut的输出被附加到文件sorted_statistics.txt中,而sort命令根本没有输出。您可能需要使用tee

cut -f 1 -d " " | tee -a sorted_statistics.txt | sort ...

tee命令将其输入发送到文件和标准输出。它就像管道中的T形接头。

您将所有内容附加到sorted_statistics.txt(使用所有输出),然后尝试使用管道中不存在的输出进行排序。我已经更正了你的代码,所以它现在可以工作了

find /home/user/ -type f -name "*.c" 2> /dev/null -exec wc -l {} \; | cut -f 1 -d " " >> tmp.txt && sort -n tmp.txt > sorted_statistics.txt

问候

您将所有内容附加到sorted_statistics.txt(使用所有输出),然后尝试使用管道中不存在的输出进行排序。我已经更正了你的代码,所以它现在可以工作了

find /home/user/ -type f -name "*.c" 2> /dev/null -exec wc -l {} \; | cut -f 1 -d " " >> tmp.txt && sort -n tmp.txt > sorted_statistics.txt


问候

它不会在任何事情之前“停止”。管道的所有部分同时运行——最后一部分与第一部分同时运行。(虽然如果你重定向了前一个组件的输出,这样它实际上就不会向后一个组件提供任何东西,那么后一个管道组件就没有什么可做的了)…也就是说,让管道的两个不同部分写入同一个输出文件没有多大意义。它可能有助于更详细地描述您正在做的事情(并可能断言是否需要追加行为——您真的想将多组统计数据合并到同一个输出文件中,因此您既有旧版本的
foo.c
的数字,也有新版本的数字?)我想我已经知道了。一般来说,我不熟悉管道,我认为它是顺序执行,这就是为什么我认为第二个版本可以很好地工作的原因。谢谢你的解释!它不会在任何事情之前“停止”。管道的所有部分同时运行——最后一部分与第一部分同时运行。(虽然如果你重定向了前一个组件的输出,这样它实际上就不会向后一个组件提供任何东西,那么后一个管道组件就没有什么可做的了)…也就是说,让管道的两个不同部分写入同一个输出文件没有多大意义。它可能有助于更详细地描述您正在做的事情(并可能断言是否需要追加行为——您真的想将多组统计数据合并到同一个输出文件中,因此您既有旧版本的
foo.c
的数字,也有新版本的数字?)我想我已经知道了。一般来说,我不熟悉管道,我认为它是顺序执行,这就是为什么我认为第二个版本可以很好地工作的原因。谢谢你的解释!这里的
cat
有什么好处?如果你想追加,tee-a可以行内追加。@CharlesDuffy:如果你使用操作符
>
,我想你想将内容追加到排序的文件\u statistics.txt中。据我所知,t不能那样做。如果您想覆盖sorted_statistics.txt,显然,您不需要cat或tail_sorted_statistics.txt文件。正如我所说,
tee
可以进行追加,如果给定
-a
参数
tee-somefile
将stdin中的内容附加到
somefile
@CharlesDuffy的末尾:我很高兴听到这个消息。你是在我读了你的答案后编辑的,还是我瞎了眼?在你发布回复之前,我编辑了第一条评论;也许更新没有及时推出。这里的
cat
有什么好处?如果你想追加,tee-a可以行内追加。@CharlesDuffy:如果你使用操作符
>
,我想你想将内容追加到排序的文件\u statistics.txt中。据我所知,t不能那样做。如果您想覆盖sorted_statistics.txt,显然,您不需要cat或tail_sorted_statistics.txt文件。正如我所说,
tee
可以进行追加,如果给定
-a
参数
tee-somefile
将stdin中的内容附加到
somefile
@CharlesDuffy的末尾:我很高兴听到这个消息。你是在我读了你的答案后编辑的,还是我瞎了眼?在你发布回复之前,我编辑了第一条评论;也许更新没有及时推出。为什么要使用
tmp.txt
?如果内存中没有足够的RAM来存储状态,GNU
sort
可以在后台处理写入磁盘上的临时文件。@CharlesDuffy我不知道。问OP,我修改的越少越好,这样OP就越清楚什么不起作用了。考虑到OP不知道他们在做什么,可能最好以最佳实践为目标,而不是最小的可能变化。我实际上并不是在寻找类似但正确的解决方案。实际上我有一个有效的命令,我只是想知道为什么其他命令根本不使用
tmp.txt
?如果内存中没有足够的RAM来存储状态,GNU
sort
可以在后台处理写入磁盘上的临时文件。@CharlesDuffy我不知道。问OP,我修改的越少越好,这样OP就知道什么不起作用了。既然OP不知道他们在做什么,那么最好