如何从tcsh中的路径中删除文件名?

时间:2009-07-05 09:11:42

标签: path tcsh

在tcsh中给出这个变量:

set i = ~/foo/bar.c

如何才能获得$i的目录部分?

~/foo

7 个答案:

答案 0 :(得分:3)

如果您的系统提供'dirname'命令,您可以:

set i = `dirname ~/foo/bar.c`
echo $i

注意变量名前面缺少的$。这个解决方案与shell无关。

答案 1 :(得分:1)

我在等待答案时发现这样做的方式:

set i = ~/foo/bar.c
echo $i:h

结果:

~/foo

答案 2 :(得分:1)

完全可以使用basename命令获取文件名:

set j = `basename ~/foo/bar.c`
echo $j

答案 3 :(得分:1)

这是与上述不同的东西:
可在tcsh中使用,但很少有其他shell AFAIK

> set i = ~/foo/bar.c
> echo ${i:t}
bar.c
> echo ${i:h}
/home/erflungued/foo

答案 4 :(得分:0)

使用dirname命令,例如:

set i = `dirname "~/foo/bar.c"`

注意路径周围的引号。包含它们很重要。如果跳过引号,dirname将失败包含空格的路径。请注意~/表达式在执行dirname之前进行评估,因此即使这样的简单示例可能会失败,如果不使用引号并且主路径包含空格。

当然同样的问题也适用于所有其他命令,始终环绕包含带引号的命令的参数是个好习惯。

答案 5 :(得分:0)

echo $i | awk -F"/" '{$NF="";print}' OFS="/"

答案 6 :(得分:0)

确实使用dirname "$i",而不是${i:h}

如果$i仅包含文件名(无路径),则后者不会产生预期结果,而dirname在这种情况下正确返回当前目录.

> set i = bar.c
> echo ${i:h}
bar.c
> dirname "$i"
.