我尝试创建一个自定义$ PS1,显示我在每个目录中有多少文件并打印结果

时间:2016-09-23 14:46:28

标签: linux bash

这是我想出的,但是当我更改目录时,结果不会改变并显示我的$ HOME目录结果

示例:

export PS1="\n\[$Blue\](\[$Red\]\u\[$White\] @
\[$Red\]$(hostname)\[$Blue\])---(\[$Green\]\w\[$Blue\])\n(\[$Green\]$(ls
-1 |wc -l) files\[$Blue\])<<--^\n\[$BRed\]\$\[\033[0m\]"

我想也许可以添加这个,但我不知道如何。

for file in $PWD
 do   echo `ls -1 |wc -l` 
 done

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

在提示延迟之前,您必须小心延迟执行ls命令。现在看来,它是在你定义PS1

时执行的
part1="\n[$Blue]([$Red]\u[$White] @ [$Red]$(hostname)[$Blue])---([$Green]\w[$Blue])"
part2="\n([$Green]"'$(ls -1 |wc -l)'" files[$Blue])<<--^"
part3="\n[$BRed]\\\$[\033[0m]"
export PS1="${part1}${part2}${part3}"
unset part1 part2 part3

请注意part2

中单引号和双引号的混合

第二个想法:为了保护包含换行符的文件,计数代码可以是

$(files=(*); echo "${#files[@]}")       # "visible" files only
# or
$(f=(* .[^.] .??*); echo "${#f[@]}")    # includes hidden files, not . or ..

将文件名存储在数组中并打印出数组的大小。此外,它只使用bash内置命令。

答案 1 :(得分:0)

包括

\$(ls -l | wc -l)

PS1中的任何地方

答案 2 :(得分:0)

我会使用find代替ls来计算文件,以确保如果文件名包含换行符,则不会多次计算。所以我会做那样的事情:

find -mindepth 1 -maxdepth 1 -printf 1 | wc -c

您可以将它放在定义os PS1中,如下所示:

PS1='... $(find -mindepth 1 -maxdepth 1 -printf 1 | wc -c) ...'