从一条不存在的路径上升一层

从一条不存在的路径上升一层

我在脚本(bash)文件中有一些这样的代码:

if [ ! -d $dir ]; then
    cd $dir/..
    git clone http://...
fi

当然,正如所写,这是行不通的,因为$dir它不存在。有没有一个好的方法可以去掉这里的顶级目录?

答案1

使用参数扩展删除路径中的最后一步。循环执行此操作,直到找到现有目录:

while [[ $dir && ! -d $dir ]] ; do
    dir=${dir%/*}
done
if [[ -d $dir ]] ; then
    echo $dir exists.
fi

答案2

chkdir() for d do ${d:+:} continue
(   cd -- "$d" && d= ||
    while cd -- "${d%"${d#*/}"}." && ! {
    [ -n "${d##*/*}" ] && break
};  do  d=${d#*/}; d=${d#"${d%%[!/]*}"}; done
    pwd -P; printf "${d:+./%s\n}\n" "$d"
);  done 2>/dev/null

这是一个小函数,应该可以处理您输入的任何路径。如果它不能简单地直接更改到目录,它将尝试遍历树。它在应该打破循环的时候打破了循环。它处理多个参数。对于每个,它要么只打印目录的整个规范路径,要么打印它设法获得的内容然后无论其论证路径剩下什么。它会跳过空参数。

这是在行动中:

$ chkdir /tmp/chrome/some/nonexistent/path .. ../test *

/tmp/chrome
./some/nonexistent/path

/home/mikeserv

/home/mikeserv/test

/home/mikeserv/test
./file1

/home/mikeserv/test
./file2

/home/mikeserv/test
./file3

如果我删除stderr最后的重定向并启用调试,您可以看到它是如何工作的。

+ chkdir .. ///tmp/.//////chrome/not/
+ : continue
+ cd -- ..
+ d=
+ pwd -P
/home/mikeserv
+ printf \n

+ : continue
+ cd -- ///tmp/.//////chrome/not/
dash: 2: cd: can't cd to ///tmp/.//////chrome/not/
+ cd -- /.
+ [ -n  ]
+ d=//tmp/.//////chrome/not/
+ d=tmp/.//////chrome/not/
+ cd -- tmp/.
+ [ -n  ]
+ d=.//////chrome/not/
+ d=.//////chrome/not/
+ cd -- ./.
+ [ -n  ]
+ d=/////chrome/not/
+ d=chrome/not/
+ cd -- chrome/.
+ [ -n  ]
+ d=not/
+ d=not/
+ cd -- not/.
dash: 3: cd: can't cd to not/.
+ pwd -P
/tmp/chrome
+ printf ./%s\n\n not/
./not/

相关内容