循环遍历给定路径中的目录,直到到达现有目录

循环遍历给定路径中的目录,直到到达现有目录

用户给出了一个未知路径,我将在该路径上创建文件。由于我没有写入权限,因此我需要从内到外找到路径中第一个现有目录并检查写入权限。

例如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

相关内容