在 bash 提示符中缩短很长的目录名称

在 bash 提示符中缩短很长的目录名称

如何从这个提示中得到

~/this/is/a-very-very-long-directory-name/dir

对此

~/this/is/a-ver...name/dir

在 bash 提示符下?

因此,将长度超过 nn (20+) 个字符的目录名称缩短为 xxxx...xxxx

注意可能重复:我想缩短一个长目录名称,而不是一个长路径/to/dir

答案1

你需要使用类似的东西, bash 没有任何内置方法。

 d='~/this/is/a-very-very-long-directory-name/with_another_very_long_name/and-here-is-yet-another-one'
# or, d=$(pwd)
e=$( echo "$d" | sed -E 's#([^/]{4})[^/]{13,}([^/.]{3})#\1...\2#g' )
echo "$e"
~/this/is/a-ve...ame/with...ame/and-...one

另一方面,您可能想在提示符中添加换行符。我用这样的东西:

PS1='\u@\h:\w\n\$ '

这看起来像

jackman@myhost:~/this/is/a-very-very-long-directory-name/with_another_very_long_name/and-here-is-yet-another-one
$ _

答案2

使用 shell 的“参数扩展”,尝试

d='~/this/is/a-very-very-long-directory-name/with_another_very_long_name/and-here-is-yet-another-one'
IFS=/
for DIR in $d
  do    [ ${#DIR} -gt 8 ] &&    { TMP=${DIR%%${DIR#????}}
                                  DIR=$TMP...${DIR##${DIR%????}}
                                }
        NEW="$NEW${NEW:+/}$DIR"
  done
echo "$NEW"
~/this/is/a-ve...name/with...name/and-...-one

IFS如果需要,保存并恢复。在子 shell 中运行将不起作用,因为您想NEW随后访问该变量(除非您使用“命令替换”...)。

相关内容