【问题标题】:Confused by shell pipe command对 shell 管道命令感到困惑
【发布时间】:2017-04-12 15:52:30
【问题描述】:

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

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

谁能告诉我它是做什么的?

【问题讨论】:

  • man find 会显示它正在搜索...常规文件。
  • 搜索常规文件并抑制前两个字符(?),然后对其进行排序并将输出写入 file.txt。也许你的 find 版本不像我的那样工作(解释 cut 命令)。

标签: shell pipe


【解决方案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 &lt;file.txt 查看。 &lt; 很傻; less 完全能够读取在其命令行上命名的文件,因此 less file.txt 可以工作。显然用户想要保存输出;否则,将sort 的输出通过管道传输到less 会更有意义。 tee 命令在这里也很有用:find ... | tee file.txt | less

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

【讨论】:

  • 我抄袭了老师给我的练习。哇,非常感谢您提供此信息。会有很大帮助
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    1. 找人

    2. 男切

    3. 人排序

    4. 少人

    【讨论】:

      猜你喜欢
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多