【问题标题】:How to enumerate a list of files如何枚举文件列表
【发布时间】:2014-05-30 14:01:56
【问题描述】:

我想获得一个编号的文件列表,例如如果我有这些文件:

a.pdf
b.pdf
c

那么它应该被列为:

1 a.pdf
2 b.pdf
3 c

【问题讨论】:

  • 不需要坚持 awk 命令。事实上,对于您的问题,使用 awk 可能是更糟糕的选择。

标签: bash awk sh


【解决方案1】:

您可以通过两种方式做到这一点:-
第一个:-
ls -1 | awk '{print NR,$0}'

第二个:-
ls -1 | cat -n
你必须更喜欢第二个,但选择你喜欢的任何一个。 :-)

【讨论】:

  • 事实上,谁看到了第一个问题。如果其他人在我之前看到这个问题,他们肯定会比我更快地给你答案.. :-)
  • 解析ls -l 几乎从来都不是一个好主意,并且会在此处破坏带有空格的文件名。
  • @BroSlow 是的,你在写。
  • 当文件名有空格时,这个接受的 awk 答案是错误的,你最好把它从答案中删除。它会混淆其他人。
  • ls 中不需要-1 标志:当您将输出传送到另一个进程时,它是默认设置。
【解决方案2】:

如果你想avoid parsing the output of ls(你这样做),你可以这样做:

$ counter=1; for f in *; do printf "%2d %s\n" $((counter++)) "$f"; done
 1 a.pdf
 2 b.pdf
 3 c

我之所以提到这一点,是因为它是做更复杂的事情的途径,而不仅仅是枚举。

【讨论】:

    【解决方案3】:

    如果你的系统有命令nl,那就更简单了。 (我可以确认nl命令存在于cygwin、aix和solaris系统中,那么它应该是大多数unix系统中的流行命令)

    ls |nl
    

    【讨论】:

      【解决方案4】:

      你可以在没有 awk 的情况下做到这一点,很简单。 ls -1 | cat -n.

      或者,使用 awk:

      ls -1 | awk '{printf "%d %s\n", NR, $0;}'
      

      【讨论】:

      • 已更新,其中 cat -n 在 awk 中重新实现。
      【解决方案5】:

      不知道为什么需要使用awk,但你可以这样做:

      ls | awk '{print NR, $0}'
      

      更新 $0$1 更好,因为它会打印整个文件名,即使有空格(如 BroSlow 所暗示的那样)

      注意 - 当输出是另一个进程时,您确实不需要需要将 -1 标志与 ls 一起使用 - 它成为默认选项。只有当你想强制输出到终端,每行一个文件时,你才需要使用它。

      【讨论】:

      • 因为它是由 awk 说的!!!谢谢它的工作原理。但我不知道为什么我在提问时遇到了问题
      • 也不确定 - 但通常反对票来自“没有表现出努力”。你说你“努力”,但没有表现出你的尝试。那个,虽然你没有这么明确地说,这闻起来像家庭作业(否则 - 为什么用 awk 做这件事?),这通常是为什么有些人(不是我)伸手去拿向下箭头的原因......跨度>
      • @alfa 正是Floris 所说的。也不知道你为什么接受你所做的答案,它对awk 的使用是相当多余的,并且会用空格破坏文件名。
      猜你喜欢
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2018-07-12
      • 2015-01-12
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多