如何在Unix中给ls命令的输出加上编号?

5
我正在尝试编写一个格式为“id file_absolute_path”的文件,它基本上会递归列出文件夹中的所有文件,并为每个列出的文件分配一个标识符,例如1、2、3、4。
我可以使用以下命令递归获取文件的绝对路径:
ls -d -1 $PWD/**/*/*

然而,我无法从ls命令的输出中获得标识符。我确信可以使用awk解决此问题,但似乎无法解决。


2
ls -d $PWD/**// 看起来真的非常脆弱。太多的文件会导致通配符失败。带有特殊字符的路径名将导致失败。超过3层的目录结构将无法捕获。最好使用find命令。 - William Pursell
6个回答

20

通过cat -n将输出连接起来。


+1 感谢您的回答。您和 Viraptor 的回答都有效。 - Snehal

9
假设x是您的命令:
x | awk '{print NR, $0}'

将输出行编号


+1 感谢回答。你的回答和Matthew Slattery的回答都有效。 - Snehal
这个答案比Mathews更干净,虽然两者都能完美运行。谢谢大家。 - Ezra A.Mosomi

8

两个可能的命令:

ls -d -1 $PWD/**/*/* | cat -n
ls -d -1 $PWD/**/*/* | nl

nl将数字放入文件行中。

我希望这样更加清晰易懂。


6

有一个名为nl的工具可用于此。

ls -la | nl


2
如果您执行ls -i,您将获得inode号码,这很适合作为标识符。
使用inode的唯一潜在问题是,如果您的文件夹跨越多个文件系统,则inode仅在文件系统内保证唯一。

大概,OP想要创建一个带编号的菜单或类似的东西。我认为inode号码不适合这种用途。 - Dennis Williamson

0

ls -d -1 $PWD/**// | awk ' {x = x + 1} {print x " " $0} '

列出当前目录下所有子目录,并在每个子目录前加上序号。


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