用户给出了一个未知路径,我将在该路径上创建文件。由于我没有写入权限,因此我需要从内到外找到路径中第一个现有目录并检查写入权限。
例如foo/moo/doo
我试过了
for d in "$dirpath"/ ; do
"dir=$d"
done
但它似乎不起作用
因此,我必须循环遍历路径,无论它是绝对路径还是相对路径,检查每个节点是否存在,以及它是否确实是一个目录,如果是,则返回它
或者如果没有返回
- 如果路径是绝对的,则可能是顶级目录(不确定在 unix 中绝对路径之上是否总是有一个具体的目录)
- 当前目录到相对路径
任何想法都感谢您的帮助
答案1
只需快速解决方案
#!/bin/bash
dir=$(realpath "$1")
stop=no
while [ $stop = no ] ; do
if touch "$dir/this.$$" ; then
rm "$dir/this.$$"
echo "You can create in $dir!"
stop=yes
else
dir=${dir%/*}
if [ "$dir" = "" ] ; then
echo "You are not allowed to write anywhere."
stop=yes
fi
fi
done
答案2
这是一个函数,它从路径最深的位置开始查找路径中第一个现有目录。
function findConcreteDirInPath() {
local dirpath="$1"
local stop="no"
while [ $stop = "no" ] ; do
if [ -d "$dirpath" ]; then
local stop="yes"
else
local dirpath=$(dirname "$dirpath")
if [ "$dirpath" = "" ] ; then
local stop="yes"
exit 1;
fi
fi
done
echo "$dirpath"
}
以下是使用示例
aPath="/var/doo/moo"
concreteDir=$(findConcreteDirInPath $aPath)
if [ $concreteDir != "." ]; then
echo -e "First concrete dir in \"$aPath\" path is: \"$concreteDir\""
# Check whether current user have write permissions for the directory
if [ -w $concreteDir ]; then
echo -e "\"$(whoami)\" user can write in \"$concreteDir\""
else
echo -e "\"$(whoami)\" user can NOT write in \"$concreteDir\""
fi
else
echo -e "No concrete dir for the given \"$aPath\" path"
fi