Bash 如何枚举文件列表

Bash 如何枚举文件列表,bash,awk,sh,Bash,Awk,Sh,我想获得文件的编号列表,例如,如果我有这些文件: a.pdf b.pdf c 那么它应该被列为: 1 a.pdf 2 b.pdf 3 c 你可以做这件事而不需要awk,很简单ls-1 | cat-n 或者,使用awk: ls -1 | awk '{printf "%d %s\n", NR, $0;}' 您可以通过两种方式来实现:- 第一个:- ls-1 | awk'{print NR,$0}' 第二条:- ls-1|cat-n 您必须选择第二个,但可以选择您喜欢的任何选项。:-) 不确定为

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

a.pdf
b.pdf
c
那么它应该被列为:

1 a.pdf
2 b.pdf
3 c

你可以做这件事而不需要awk,很简单<代码>ls-1 | cat-n

或者,使用awk:

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

您可以通过两种方式来实现:-
第一个:-
ls-1 | awk'{print NR,$0}'

第二条:-
ls-1|cat-n


您必须选择第二个,但可以选择您喜欢的任何选项。:-)

不确定为什么需要使用
awk
,但现在您可以:

ls | awk '{print NR, $0}'
更新的
$0
优于
$1
,因为它将打印整个文件名,即使带有空格(正如BroSlow所暗示的)


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

如果您的系统有命令
nl
,则会更容易。(我可以确认cygwin、aix和solaris系统中存在
nl
命令,那么它应该是大多数unix系统中流行的命令)

如果你想(你是这样做的),你可以这样做:

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

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

更新了,在awk中重新实现了cat-n。因为据说是由awk实现的!!!谢谢,这是有效的。但我不知道为什么我在问问题时陷入了低谷。我也不确定——但通常情况下,低谷票来自“没有表现出努力”。你说你“努力过”,但没有表现出你的努力。这就是为什么有些人(不是我)会选择向下箭头…@alfa正是
Floris
所说的。也不知道你为什么接受你的答案,它使用的
awk
是相当多余的,会用空格分隔文件名。事实上,谁先看到了这个问题。如果其他人在我之前看到这个问题,他们肯定会比我更快地给你答案…-)解析
ls-l
几乎从来都不是一个好主意,它会在这里用空格分隔文件名。@BroSlow是的,你在写。当文件名有空格时,这个公认的awk答案是错误的,你最好从答案中删除它。它会混淆其他进程。无需在
ls
中使用
-1
标志:当您将输出传输到另一个进程时,这是默认值。无需坚持awk命令。事实上,对于你的问题,使用awk可能是更糟糕的选择。
$ counter=1; for f in *; do printf "%2d %s\n" $((counter++)) "$f"; done
 1 a.pdf
 2 b.pdf
 3 c