分页时保留 ls 的多列输出

Mat*_*tty 6 ls

默认情况下,ls在多列中显示其输出,但是当它被发送到寻呼机时,例如less它被重新格式化为单列。有什么方法可以分页原始的多列输出并保留格式?

enz*_*tib 9

有两种选择

   -C     list entries by columns
   -x     list entries by lines instead of by columns
Run Code Online (Sandbox Code Playgroud)

第一个显示列中的输出,其中每一列都在前面(从排序的角度来看):

enzotib@acer:tmp$ touch {10..99}
enzotib@acer:tmp$ ls -C | less
10  15  20  25  30  35  40  45  50  55  60  65  70  75  80  85  90  95
11  16  21  26  31  36  41  46  51  56  61  66  71  76  81  86  91  96
12  17  22  27  32  37  42  47  52  57  62  67  72  77  82  87  92  97
13  18  23  28  33  38  43  48  53  58  63  68  73  78  83  88  93  98
14  19  24  29  34  39  44  49  54  59  64  69  74  79  84  89  94  99
Run Code Online (Sandbox Code Playgroud)

第二个选项将第一个元素放在第一行,然后放在第二行,依此类推:

enzotib@acer:tmp$ ls -x | less
10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29
30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49
50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69
70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89
90  91  92  93  94  95  96  97  98  99
Run Code Online (Sandbox Code Playgroud)

当管道到寻呼机时,不考虑终端宽度和颜色格式ls。要强制执行此操作,您可以这样做

ls -Cw $COLUMNS --color | less -r
Run Code Online (Sandbox Code Playgroud)

其中-r选项 toless需要正确解释 ANSI 颜色序列。
将此行放入脚本中不起作用,因为COLUMNS未导出到子shell。可以使用两种解决方法

  1. export COLUMNS 在你的 ~/.bashrc

  2. 将该行实现为函数或别名 ~/.bashrc

    myls() {
        ls -Cw $COLUMNS --color "$@" | less -r
    }
    
    Run Code Online (Sandbox Code Playgroud)