这是标准输出ls -ln | nl
wolf@linux:~$ ls -lh | nl
1 total 24
2 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
3 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
4 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
wolf@linux:~$
total 24
是否可以从第二行的实际文件/目录开始,而不是从 开始数字?
所需输出
wolf@linux:~$ ls -lh | nl
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
wolf@linux:~$
答案1
将第一行与其他内容一起使用,然后将其余的传递给nl
$ ls -lh | { sed -u q; nl; }
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
sed
(用于-u
禁用缓冲),将消耗一行和q
uit,在终止前隐式打印该行。nl
消耗剩余的线路。
如果你确实想要第一行缩进,你可以这样做:
$ ls -lh | { sed -u 's/^/ /;q'; nl; }
total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
如果您想进一步向下开始行编号,请告诉sed
何时q
退出:
$ ls -alh | { sed -u 's/^/ /;3q'; nl; }
total 24
drwx------ 1 wolf wolf 186 Sep 24 22:18 .
drwx------ 1 wolf wolf 186 Sep 24 22:18 ..
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
您也可以使用类似的东西/\.\.$/q
来代替3q
.
答案2
这nl
将从 0 开始:
$ ls -lh | nl -v 0
0 total 24
1 -rw-rw-r-- 1 wolf wolf 186 Sep 24 22:18 01.py
2 -rw-rw-r-- 1 wolf wolf 585 Sep 24 22:21 02.py
3 -rw-rw-r-- 1 wolf wolf 933 Sep 24 22:26 03.py
答案3
它有点难看,但至少使用 GNU Coreutils 实现,nl
您可以通过正则表达式指定要编号的行 - 因为t
它不是ls
长列表输出中可能的文件类型之一1你可以做
ls -lh | nl -bp'^[^t]'
不幸的是,这并不能保留输出对齐。
也许最正式正确的方法是将ls
输出分成不同的标题和正文部分:
$ ls -lh | sed -e '1s/.*/\\:\\:\\:\n&\n\\:\\:/' | nl
total 0
1 -rw-rw-rw- 1 steeldriver steeldriver 0 Sep 9 19:53 bar
2 -rw-r--r-- 1 steeldriver steeldriver 449 Sep 16 17:41 bash_envs
3 -rw-rw-rw- 1 steeldriver steeldriver 131 Sep 5 18:13 dirlist
4 -rw-r--r-- 1 steeldriver steeldriver 359 Sep 13 19:42 error_status
(默认情况下,标题编号样式为没有任何)。
答案4
你可以尝试用awk
以下方法代替:
ls -lh | awk '{printf("%5s ",NR==1?" ":NR-1); print}'
这将打印“总计”行而不对其进行编号,以及所有剩余的带有数字的行,右调整,字段宽度为 5。数字和行内容之间的空格将是两个空格(格式字符串5s
中的后面的文本)printf()
);您可以将其替换为其他内容,例如\t
.
如果您不需要“总计”行,您可以使用
ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'
或者
ls -lh | awk 'NR>1 {printf("%5s ",NR-1); print}'
反而。