Bash替换为basename提供一个前导目录组件

时间:2014-03-27 17:05:12

标签: bash gnu-screen dirname

对于GNU Screen标题,我想获得当前目录名称的前缀,其名称前缀为其父目录。例如,在目录

/home/rhys/share/pkgconfig
/home/rhys
/home
/

产生输出

share/pkgconfig
home/rhys
home
/

在Bash中,从猜测开始

echo $(basename $(dirname $PWD))/$(basename $PWD)

可以找到更好的解决方案

echo $(basename "${PWD%/*}")/${PWD##*/}

我说得更好,因为产生的进程少了两个。

任何人都有一个可爱的伎俩,以避免使用basename?这是针对每个shell提示符运行的内容,因此尽可能轻量级是很好的。

3 个答案:

答案 0 :(得分:0)

如何使用bash和awk:

awk -F'/' '{print $(NF-1)"/"$NF}' <<<"$PWD"

修改

前一个不太正确,因为它会打印/home而不仅仅是home。也许你可以忍受。如果没有,这个完全有效:

awk -F'/' '{if (NF==2 && $2) {$0=$2} else {$0=$(NF-1)"/"$NF}}1' <<<"$PWD"

测试出来:

awk -F'/' '{if (NF==2 && $2) {$0=$2} else {$0=$(NF-1)"/"$NF}}1' <<EOF
/home/rhys/share/pkgconfig
/home/rhys
/home
/
EOF

输出:

share/pkgconfig
home/rhys
home
/

答案 1 :(得分:0)

这是一个可以在bash 4或更高版本中使用的功能:

trim () (
  IFS=/
  read -a c <<< "$1"
  unset c[0]
  fragment="${c[*]: -2:2}"
  echo "${fragment:-/}"
)

for p in /home/rhys/share/pkgconfig /home/rhys /home /; do
  trim "$p"
done

share/pkgconfig
home/rhys
home
/

答案 2 :(得分:0)

for p in /home/rhys/share/pkgconfig /home/rhys /home /; do
  [[ $p =~ .*/([^/]+/[^/]+)$ ]] && echo "${BASH_REMATCH[1]}" || echo "$p"
done

作为一项功能:

last2() { [[ $1 =~ .*/([^/]+/[^/]+)$ ]] && echo "${BASH_REMATCH[1]}" || echo "$1"; }

应该在bash&gt; = 3.2

上工作