使用命令“ ls”枚举文件和目录


11

ls在当前目录上运行命令并获取输出:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

我想列举一下它们:

1. Applications
2. Desktop
3. Documents
4. Downloads
5. Library
6. Movies
7. Music
8. Pictures
9. Public

这可以通过less中间方式来实现

ls | less -N

如何以简单的方式枚举它们?


您是否希望这种情况总是发生,还是只是有时候?在第一种情况下,您可以为答案中的一个命令创建ls的别名;在第二个步骤中,创建一个新别名-对命令说“ lsn”。
jamesqf

Answers:


16

或者干脆做:

ls -b |nl -s '. ' -w 1
1. a\ file\ with\ nonewline
2. a\ file\ with\nnewline
3. a\ file\ with\ space
4. afile

来自man nl

-s, --number-separator=STRING
              add STRING after (possible) line number
-w, --number-width=NUMBER
              use NUMBER columns for line numbers

13

您应该通过管道将输出ls传递到另一个命令。我的建议是使用awk这样

$ ls -b --group-directories-first | awk '{print NR ". " $0}'
1. dir1
2. dir2
3. dir3
4. z-dir1
5. z-dir2
6. z-dir3
7. file1
8. file2
9. file3
10. file4
11. file5
12. file6
13. file7
14. file\nnewline
  • 请注意,该文件名中file\nnewline包含换行符\n,该字符可通过该选项进行转义-b

  • 该选项--group-directories-first将在文件之前输出目录。

另一种可能的方法是使用for循环(但在这种情况下,将目录放置在列表的开头将变得更加困难):

n=1; for i in *; do echo $((n++)). $i; done

11

如果只是显示一个数字,那么您有以下几种选择以及自己的选择less -N

$ ls |cat -n
$ ls |nl

如果您想要自定义输出编号,那么我建议您使用find并做您想打印的任何事情:

find . -exec bash -c 'for fnd; do printf "%d. %s\n" "$((++i))" "$fnd"; done ' _ {} +

POSIXly,您将执行以下操作:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +

在这种情况下,i必须事先进行初始化:i=0; find ...
rexkogitans

不一定要在这里,因为-exec sh -c '....' 在单独的sh shell下运行。
αғsнιη

3

您还可以使用简短的Bash脚本完全完成此操作:

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
i=0
for f in *; do
    printf '%d. %s\n' "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

您甚至可以幻想并填充行号以获得9个以上的结果:

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
ls=(*)
pad=${#ls[@]}
pad=${#pad}
i=0
for f in *; do
    printf '%*d. %s\n' "$pad" "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

用法

假设您将脚本另存为numbered-ls.sh当前工作目录中的可执行文件:

./numbered-ls.sh [DIRECTORY]

该参数DIRECTORY是可选的,默认为当前工作目录。

说明

  1. 如果使用参数调用了脚本,则将工作目录更改为第一个参数中的路径。

  2. 匹配当前工作目录的所有条目并查看它们。对于每个条目,增加一个计数器并打印其值以及条目名称。条目名称中的换行符被替换为^N

  3. 通过管道传递输出,cat -vt以优雅地处理包含不可打印字符的文件名,终端可以将其解释为控制字符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.