У меня есть неизвестный путь, указанный пользователем, где я хотел бы создать файл. Поскольку у меня нет разрешений на запись, мне нужно найти первый существующий каталог в пути, идущем изнутри наружу, и проверить наличие разрешений на запись.

Например, foo/moo/doo

я пробовал

for d in "$dirpath"/ ; do
    "dir=$d"
done

Но это не похоже на работу

Поэтому я должен выполнить цикл по пути, является ли он абсолютным или относительным, проверить каждый узел, существует ли он и действительно ли это каталог, и если да, вернуть его

или если не вернуть

  • возможно верхний каталог, если путь абсолютный (не уверен, что всегда есть конкретный каталог в unix поверх абсолютного пути)
  • Текущий каталог с относительным путем

Любые идеи ценят вашу помощь

2 ответа2

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
0

Вот функция, которая находит первый существующий каталог в пути, начиная с самого глубокого местоположения в пути.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .