ls 命令行换行预防

ls 命令行换行预防

我正在寻找这个问题的答案,不涉及命令less

有没有办法ls在终端中运行命令并防止长文件名换行?

例如,在运行 ls 时,而不是以下内容:

shortfile
thisisalongfi
lename
shortfile

我希望它在要换行的位置截断长文件名,或者根本不换行,以便它显示为:

shortfile
thisisalongfi
shortfile

答案1

setterm --linewrap off
ls
setterm --linewrap on

setterm将尽力配置您的终端(终端仿真器),但一般来说,终端可能支持也可能不支持该功能。

答案2

ls命令没有截断文件名的选项,因此您需要一个额外的工具。

您可以使用cut截断一行。在终端中,环境变量LINES包含COLUMNS终端尺寸。

ls | cut -c 1-$COLUMNS

ls这可以抑制通常混叠的着色。没有简单的方法可以将着色与基于文本工具的截断相结合,因此如果您想要着色,最好使用告诉终端本身截断

答案3

标准fold(1)命令在这里有点糟糕,因为很难区分包装的文件名和未包装的文件名:

$ printf 'short\nlongeshort\nshort\n' | fold -w 5
short
longe
short
short

GNUsed可以工作,但有点受到反斜杠的影响:

$ printf 'short\nlongeshort\nshort\n' | gsed 's/\(.\{5\}\).*/\1/'
short
longe
short

awk可以显示行被截断的位置:

$ printf 'short\nlongeshort\nshort\n' |
awk -v w=5 '{if(length > w){print substr($0,0,w-3) "..."}else{print}}'
short
lo...
short

尽管这可能应该隐藏在接受宽度参数的脚本中w,或者$COLUMNS默认使用。

同时,

$ setterm --linewrap off
ksh: setterm: not found
$ pkglocate setterm
$ 

不太利于便携性。

相关内容