2017-04-12 108 views
-2

所以我正在做一个C程序,模拟shell中的管道命令,但我很困惑它。我知道它在我的目录中搜索一些东西,对它进行排序并将其广告给一个file.txt,但我不知道它搜索的是什么。由shell管道命令迷茫

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

有人能告诉我它是干什么的吗?

+0

'man find'会显示它搜索...常规文件。 –

+0

搜索常规文件并压缩前两个字符(?),然后将其排序并将输出写入file.txt。也许你的find版本不能像我一样工作(解释cut命令)。 –

回答

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选项,可让您指定,确切地说它打印的信息以及顺序。

+0

我从老师给我的练习中复制而来。哇,非常感谢你的这个信息。这将有助于很多 – Ackerman

0
  1. 人发现

  2. 人砍

  3. 人排序

  4. 人少

1

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

+0

非常感谢! – Ackerman