Bash:如何在Bash中用省略号截断'ls'的长输出?

时间:2019-04-08 07:46:17

标签: bash

我正在通过添加更多信息来自定义Bash提示符,其中包括对当前目录列表的一瞥。

我已经知道,更改变量PS1将对我有帮助。更重要的是,该变量允许我每次执行命令。

我尝试使用ls --color=always来获取当前目录中的文件列表。实现如下:

PS1='... $(ls -F --color=always | xargs | cut -d " " -f -20)\n ...'

每次在当前目录中,shell最多可以获取20个文件名。但是,它永远不会告诉我是否还有更多文件。我需要做什么?我希望它能用省略号(...)告诉我。

PS:根据输出环境(例如tty和file),“ ls”的行为似乎有所不同。如果我想在提示符下显示格式化的输出(多行)怎么办?

2 个答案:

答案 0 :(得分:0)

也许您可以只使用

$(ls -F --color=always | xargs | cut -d " " -f -20; [ $(ls -l . | egrep -c '^-') -gt 20 ] && echo ...)

第二部分来自Count number of files within a directory in Linux?

但是我想有更好的方法(例如,不两次拨打 ls )。

希望有帮助。

答案 1 :(得分:0)

如果只想在每次提示前查看当前目录中的文件列表,则只需设置PROMPT_COMMAND=ls。为此,请勿与PS1一起玩。

根据您的要求,我认为这会起作用:

PROMPT_COMMAND="ls | awk 'NR>20{print \"...\"; exit}1' | xargs"

说明:

  1. PROMPT_COMMAND=something:在显示something提示符之前运行PS1
  2. ls:列出文件。随时添加-F--color=auto
  3. awk 'NR>20{print "..."; exit}1':如果行号大于20,则只需打印...并退出。否则,按原样打印行(尾随1)。
  4. xargs:将空格展平为单个空格字符。

注意:awk | xargs可以合并为单个awk命令,从而为您节省了每次提示的过程。但是,这需要额外转义"字符,这会使初学者感到困惑。

PROMPT_COMMAND="ls --color=always | awk 'NR>20{printf \"...\"; exit}{printf \$0 \" \";}END{print \"\"}'"