Bash:剪切当前路径直到某个文件夹

时间:2017-12-14 14:15:05

标签: linux bash

假设我在不同的目录中有三个bash文件:

/a/b/c/d/e/f/script1.sh
/a/bb/c/d/script2.sh
/aa/b/c/d/e/f/g/h/script3.sh

如果我调用$(pwd),我会得到当前目录的路径。有没有办法以某种方式“裁剪”这条路径,直到某个文件夹?在下面的例子中显示了某个文件夹是否会被称为“c”:

  • 在script1.sh的情况下,我想要路径:/ a / b / c
  • 在script2.sh的情况下,我想要路径:/ a / bb / c
  • 在script3.sh的情况下,我想要路径:/ aa / b / c

感谢您的帮助

5 个答案:

答案 0 :(得分:2)

我假设你想要的是参数扩展:

$ path="/a/b/c/d/e/f/script1.sh"
$ echo "${path#*/c}"
/d/e/f/script1.sh

修改

反转:

$ path="/a/b/c/d/e/f/script1.sh"
$ echo "${path%/d*}"
/a/b/c

问候!

答案 1 :(得分:1)

Bash正则表达式:

#!/bin/bash
[[ "$PWD" =~ (^/[^/]+/[^/]+/[^/]+)(.*) ]] && echo ${BASH_REMATCH[1]}

它返回路径的前三个组件(如果有三个组件)。您还可以设置路径tp,例如$pwd和:

$ pwd=/a/b/c/d/e/f/script1.sh
$ [[ "$pwd" =~ (^/[^/]+/[^/]+/[^/]+)(.*) ]] && echo ${BASH_REMATCH[1]}
/a/b/c

另外,请注意以下@ 123的评论;这是正确的方式,我的思绪已经消失了。谢谢,先生。

答案 2 :(得分:1)

使用cut命令:

echo '/a/b/c/d/e/f/script1.sh' | cut -d '/' -f 1-4
echo '/a/bb/c/d/script2.sh' | cut -d '/' -f 1-4
echo '/aa/b/c/d/e/f/g/h/script3.sh' | cut -d '/' -f 1-4

答案 3 :(得分:0)

试试这个:

[sahaquiel@sahaquiel-PC h]$ pwd
/home/sahaquiel/a/b/c/d/e/f/g/h
[sahaquiel@sahaquiel-PC h]$ pwd | cut -d"/" -f1-6
/home/sahaquiel/a/b/c

答案 4 :(得分:0)

考虑到这样的情况:

$ pwd
/a/b/c/d/cc/e/c/f

$ FOLDER=c

您可以在$PWD变量上使用shell parameter expansion,如下所示:

$ echo "${PWD%/${FOLDER}/*}/${FOLDER}"
/a/b/c/d/cc/e/c

$ echo "${PWD%%/${FOLDER}/*}/${FOLDER}"
/a/b/c

区别在于单{或%。对于%,扩展的结果是具有最短匹配模式的参数(${PWD})的扩展值。使用%%,它将是最长的匹配模式。

请确保使用正斜杠将${FOLDER}变量括起来,否则它可能会匹配名称中包含匹配项的目录(如本例中的目录cc)< / p>

因为您想要包含您要查找的文件夹,所以它包含在字符串末尾,前缀为正斜杠。