Faz um loop pelos diretórios em um determinado caminho até que um diretório existente seja atingido

0

Eu tenho um caminho desconhecido dado pelo usuário onde eu criaria um arquivo. Como não tenho permissões de gravação, preciso encontrar o primeiro diretório existente no caminho indo de dentro para fora e verificar as permissões de gravação.

Por exemplo, foo/moo/doo

Eu tentei

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

Mas parece que não funciona

Então eu devo percorrer o caminho, seja absoluta ou relativa, verificar se cada nó existe e se é um diretório de fato e, se for o caso, retornar

ou se não retornar

  • talvez o diretório principal se o caminho for absoluto (não tenho certeza se há sempre um diretório concreto no unix em cima do caminho absoluto)
  • Diretório atual para o caminho relativo

Todas as ideias agradecem sua gentil ajuda

    
por Jocky Doe 28.09.2018 / 22:38

2 respostas

0

Aqui está uma função que encontra o primeiro diretório existente em um caminho a partir do local mais profundo do caminho.

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"
}

Veja um exemplo de uso

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
    
por 06.10.2018 / 18:36
1

Apenas uma solução rápida

#!/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
    
por 29.09.2018 / 10:52