Pętlę przez katalogi w danej ścieżce, aż do osiągnięcia istniejącego katalogu

0

Mam nieznaną ścieżkę podaną przez użytkownika, w której chciałbym utworzyć plik. Ponieważ nie mam uprawnień do zapisu, muszę znaleźć pierwszy istniejący katalog na ścieżce przechodzącej od wewnątrz na zewnątrz i sprawdzić uprawnienia do zapisu.

Na przykład foo/moo/doo

próbowałem

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

Ale to nie działa

Muszę więc zapętlić ścieżkę, czy jest to absolutna, czy względna, sprawdzić każdy węzeł, czy istnieje i czy to rzeczywiście katalog, a jeśli tak, to zwróć go

lub jeśli nie wróci

  • być może główny katalog, jeśli ścieżka jest bezwzględna (nie jestem pewien, czy w unixie zawsze jest konkretny katalog na szczycie ścieżki bezwzględnej)
  • Bieżący katalog do ścieżki względnej

Wszelkie pomysły docenią twoją miłą pomoc

Jocky Doe
źródło
"dir=$d"nie robi tego, czego oczekujesz. musisz podać tylko wartość, a nie całe zadanie.
l0b0
@ l0b0 jak uzyskać tylko wartość?
Jocky Doe
1
Nie wiem o co ci chodzi. Czy możesz zaktualizować swoje pytanie, aby zawierało przykład ?
l0b0
1
„aby stworzyć resztę nieistniejącą” - patrz mkdir -p.
Kamil Maciorowski
1
Jeśli nie masz uprawnień do zapisu, nie możesz „utworzyć pozostałych nieistniejących”, prawda? Może, chyba że katalog, w którym nie można zapisać, jest pusty i można go usunąć; lub jest to twój katalog i możesz dać sobie uprawnienia. Gdybym był tobą, pocałowałbym . Jeśli mkdir -pzwraca „odmowa uprawnień”, załóżmy, że istnieje powód, dla którego uprawnienia są takie, a najlepszym, co może zrobić skrypt, jest zgłoszenie błędu; następnie prowadzisz dochodzenie ręcznie. Każda niewygodna logika skryptowa może przynieść odwrót.
Kamil Maciorowski

Odpowiedzi:

1

Po prostu szybkie rozwiązanie

#!/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
Ljm Dullaart
źródło
10x twoja odpowiedź pomogła mi stworzyć funkcję, która wykonuje pracę
Jocky Doe
Jeśli to rozwiązało problem, oznacz rozwiązanie jako takie.
Ljm Dullaart,
0

Oto funkcja, która znajduje pierwszy istniejący katalog na ścieżce, zaczynając od najgłębszego miejsca na ścieżce.

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

Oto przykład użycia

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
Jocky Doe
źródło