【问题标题】:Bash: How to truncate long output of 'ls' with ellipsis in Bash?Bash:如何在 Bash 中用省略号截断“ls”的长输出?
【发布时间】:2019-08-29 07:29:59
【问题描述】:

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

我已经明白,更改变量 PS1 将帮助我完成所有工作。更重要的是,这个变量允许我每次都执行命令。

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

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

shell 每次都会在当前目录中为我提供最多 20 个文件名。但是,它从不告诉我是否还有更多文件。我需要做什么?我希望它用省略号('...')或其他东西告诉我。

PS:根据输出环境(例如 tty 和文件),'ls' 的行为似乎有所不同。如果我想要在提示中格式化输出(包含更多行)怎么办?

【问题讨论】:

  • @biffen: xargs 没有任何参数与xargs echo 相同。基本上,OP 想要将所有相邻的空白字符展平为一个空格字符。

标签: bash


【解决方案1】:

如果您只想在每次提示之前查看当前目录中的文件列表,您可以设置PROMPT_COMMAND=ls。不要为了这种目的玩PS1

根据您的要求,我认为这可行:

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

解释:

  1. PROMPT_COMMAND=something:在显示PS1 提示符之前运行something
  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 \"\"}'"

【讨论】:

  • 感谢您介绍PROMPT_COMMAND。我现在想知道为什么awk 命令中需要有一个ENDprint ""这句话是不是只表示提示符前换行?
  • 之前的printf 语句不添加换行符\n。显式 print ""printf "\n" 将添加它。
【解决方案2】:

也许你可以使用

$(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 两次)。

希望对你有帮助。

【讨论】:

  • 感谢您的建议。我认为可以不拨打ls 两次。也许将结果存储在变量中应该可行,当然这个过程需要在本地函数中完成。我试试看。
  • 太棒了。现在请告诉我你找到了什么。
  • 我试过如下:首先定义一个名为showdir()的函数。然后定义一个局部变量local FILES=$(ls --color=always -F),并通过echo ${FILES} | xargs | cut -d " " -f -20; [ $(wc -w <<< "${FILES}") -gt 20 ] && echo " ..."显示出来。在PS1PROMPT_COMMAND 中,只需这样做:... $(showdir) ...。这看起来很尴尬,但这样就可以了。我不知道确切的权衡。
  • 谢谢。我去看看!
猜你喜欢
  • 2017-01-09
  • 1970-01-01
  • 2011-05-17
  • 2023-03-09
  • 2011-09-17
  • 2016-10-18
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多