从文件路径中删除第一个目录组件

时间:2011-03-15 12:50:42

标签: bash shell text-processing

我需要从Bash中的变量中删除一个目录(最左边)。我找到了如何删除所有路径或使用dirname和其他路径的方法,但它删除了右侧的所有或一个路径组件;它不会帮助我。所以你对我需要的东西有了更好的理解,我会写一个例子:

我有a/project/hello.ca/project/docs/README,...我想删除a/,所以在一些命令之后我会project/hello.cproject/docs/README ,...

6 个答案:

答案 0 :(得分:79)

您可以使用以下任何一项:

x=a/b/c/d
y=a/
echo ${x#a/}
echo ${x#$y}
echo ${x#*/}

所有三个echo命令都会产生b/c/d;当然,您可以以任何方式使用该值。

当你知道编写脚本时需要删除的名称时,第一个是合适的。

如果您的变量包含需要删除的前缀(次要变体:y=a; echo ${x#$y/}),则第二个是合适的。

第三个是最通用的 - 它删除任意前缀直到第一个斜杠。当我在MacOS X 10.6.6上使用*(版本3.2)进行测试时,我感到非常惊讶地发现bash非贪婪地工作 - 我会把它归结为过多的Perl和regex工作(因为,当我考虑它时,shell中的*不包括斜杠。)

答案 1 :(得分:4)

echo "a/project/hello.c" | sed 's,^[^/]*/,,'

答案 2 :(得分:1)

查看man expr

expr "foo/bar/baz" : '[^/]*/\(.*\)'会做你想做的事。

答案 3 :(得分:1)

echo a/project/hello.c | cut -d'/' -f2-

答案 4 :(得分:0)

上述例子都没有解决我的问题。我想通过更改 $ PATH 值来切换java版本。谷歌搜索后找不到足够的答案,我在下面编写了自己的解决方案。

以下是 .bashrc 中的摘录:

jv8() {
    export JAVA_HOME=/opt/jdk1.8.0_121
    y=$(echo $PATH | tr ':' '\n' |sed '/\/opt\/jdk/d' | tr '\n' ':')
    export PATH=$JAVA_HOME/bin:$y
}

jv6() {
    export JAVA_HOME=/opt/jdk1.6.0_45
    y=$(echo $PATH | tr ':' '\n' |sed '/\/opt\/jdk/d' | tr '\n' ':')
    export PATH=$JAVA_HOME/bin:$y
}

所以,在我的bash shell中,我可以简单地切换:

$> jv6
java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
$> jv8
java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

答案 5 :(得分:0)

您可以通过管道传输到 xargs 并进行新的替换

我如何使用它将 ts-src 下目录中的所有文件从 ts 重命名为 js,将 tsx 重命名为 jsx 到相同的子目录。

find ts-src/ -type f -not -name "*.tsx" -not -name "*.ts" \
  -exec bash -c 'echo "${0##*/}" "${0##ts-src/}" "$0"' {} \; | \
    xargs -l bash -c 'echo mkdir -p "src/${1%$0}" && echo cp "$2" "src/$0"'