如何枚举文件列表

14

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

a.pdf
b.pdf
c

那么它应该列在以下位置:

1 a.pdf
2 b.pdf
3 c

3
不必坚持使用awk命令。实际上,对于你的问题,使用awk可能是更糟糕的选择。 - BMW
5个回答

15
你可以用两种方法来实现:
第一种方法:
ls -1 | awk '{print NR,$0}'

第二种方法:
ls -1 | cat -n
你应该选择第二种方法,但也可以自行选择。 :-)

1
这是事实,谁先看到问题就会先回答。如果其他人比我先看到,他们肯定会比我更快地给你答案.. :-) - Devavrata
解析 ls -l 几乎从来不是一个好主意,因为这会破坏文件名中包含空格的情况。 - Reinstate Monica Please
@BroSlow 是的,你说得对。 - Devavrata
1
这个被接受的 awk 答案在文件名包含空格时是错误的,你最好从答案中删除它。它会让其他人感到困惑。 - BMW
1
在使用管道将输出传递给另一个进程时,默认情况下不需要在 ls 命令中加上 -1 标志。 - Floris

14
如果你想要避免解析ls的输出(你确实需要这样做),你可以像下面这样做:
$ counter=1; for f in *; do printf "%2d %s\n" $((counter++)) "$f"; done
 1 a.pdf
 2 b.pdf
 3 c

我提到这个只是因为这是做更复杂的事情的路径,而不仅仅是枚举。

8

如果您的系统有nl命令,那么将更容易。 (我可以确认nl命令存在于Cygwin、AIX和Solaris系统中,因此它应该是大多数Unix系统中常用的命令)

ls |nl

1

不确定为什么需要使用 awk,但是这里有:

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

更新 $0$1 更好,因为它将打印包含空格的完整文件名(正如 BroSlow 所示)。

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


因为它是由awk说的!谢谢,它有效了。但我不知道为什么在提问时会被扣分。 - user3538159
不确定,但通常会因为“没有展示努力”而被踩。你说你“很努力”,但并没有展示你的尝试。这个问题看起来像是作业,虽然你没有明确说明(否则,为什么要用awk?),这通常是一些人(不包括我)使用踩的原因。 - Floris
@alfa 正是 Floris 所说的。我也不确定为什么你接受了那个答案,它使用的 awk 是相当冗余的,并且会破坏带有空格的文件名。 - Reinstate Monica Please

1
你可以轻松地不使用awk来完成此操作,ls -1 | cat -n
或者,使用awk:
ls -1 | awk '{printf "%d %s\n", NR, $0;}'

1
更新,其中cat -n在awk中重新实现。 - Scott Lawrence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接