由shell管道命令困惑

时间:2017-04-12 15:52:31

标签: shell pipe

所以我在C中用一个程序来模拟shell中的管道命令,但我对此感到困惑。我知道它在我的目录中搜索某些内容,对其进行排序并将其广告到file.txt,但我不知道它搜索的是什么。

find . -type f -ls | cut -c 2- | sort -n -k 7 >file.txt ; less <file.txt

有人可以告诉我它的作用吗?

3 个答案:

答案 0 :(得分:1)

find . -type f搜索当前目录中的常规文件(.表示当前目录)或任何子目录,-ls只是以与ls相同的格式打印结果。 cut -c 2-find的输出中删除2个第一个字符,然后以数字方式对其进行排序并输入到文件中,然后使用less读取该文件。

答案 1 :(得分:1)

find . -type f -ls | cut -c 2- | sort -n -k 7 >file.txt ; less <file.txt

这是一个非常奇怪的命令。你确定你已正确复制它吗?它来自哪里?

我建议分解命令,通过less管道部分版本的输出,这样你就可以看到发生了什么。 (当然,如果你还没有,你应该阅读所有相关的手册页。)

find . | less
find . -type f | less
find . -type f -ls | less
find . -type f -ls | cut -c 2- | less
...

或者使用head而不是less,这样您就可以看到输出的前几行。

find . -type f以递归方式查找当前目录('.')下的所有普通文件。 -ls选项告诉它为每个文件显示一行,格式与ls -l生成的格式类似。

find ... -ls的输出以数字inode编号开头。该号码可能印有前导空格。

cut -c 2-删除less输出的每一行的前两个字符。我不知道你为什么要那样做。我怀疑这个想法是确保在行的开头没有空格,但这不是一个可靠的方法。如果inode数量恰好足够小,则可能有三个或更多前导空格。这样做会更好sed 's/^ *//' - 但它甚至没有必要。

sort -n -k 7在第7个空白分隔字段上进行数字排序,该字段恰好是文件的字节大小。所以这是根据文件的大小对列表进行排序,从最小到最大。我想,之前的cut命令是为了确保大小是第7个字段,即使原始行以空格开头,但这不是必需的(除非它可能是sort的版本行为有点不同)。

输出将写入file.txt,然后使用less <file.txt进行查看。 <是愚蠢的; less完全能够从命令行中命名的文件中读取,因此less file.txt可以正常工作。显然用户想要保存输出;否则将sort的输出传递给less会更有意义。 tee命令在这里也很有用:find ... | tee file.txt | less

find ... -ls的输出与ls -l的输出一样,是人类可读的;用于自动文本处理的。从一个实现到另一个实现可能略有不同。有一些方法可以产生更多的常规输出。如果你有GNU find,它有一个-printf选项,可以让你指定完全它打印的信息,以及按什么顺序。

答案 2 :(得分:0)

  1. 找人

  2. Man cut

  3. 男子排序

  4. 男人少