Durchlaufen Sie Verzeichnisse in einem bestimmten Pfad, bis ein vorhandenes Verzeichnis erreicht wird

525
Jocky Doe

Der Benutzer hat einen unbekannten Pfad angegeben, unter dem ich eine Datei erstellen würde. Da ich keine Schreibberechtigung habe, muss ich das erste vorhandene Verzeichnis im Pfad von innen nach außen finden und nach Schreibberechtigungen suchen.

Zum Beispiel foo/moo/doo

ich habe es versucht

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

Aber es scheint nicht zu funktionieren

Also muss ich durch den Pfad gehen, ob es absolut oder relativ ist, jeden Knoten überprüfen, ob er existiert und ob es sich tatsächlich um ein Verzeichnis handelt und falls ja, es zurückgeben

oder wenn nicht zurückkehren

  • vielleicht oberes Verzeichnis, wenn der Pfad absolut ist (nicht sicher, ob es immer ein konkretes Verzeichnis in Unix über dem absoluten Pfad gibt)
  • Aktuelles Verzeichnis zum relativen Pfad

Alle Ideen schätzen Ihre freundliche Hilfe

0
`" dir = $ d "` tut nicht was Sie erwarten. Sie müssen nur den Wert angeben, nicht die gesamte Zuordnung. l0b0 vor 5 Jahren 0
@ l0b0 wie bekomme ich nur den wert? Jocky Doe vor 5 Jahren 0
Ich weiß nicht was du meinst. Könnten Sie Ihre Frage bitte um ein [Beispiel] (https://stackoverflow.com/help/mcve) ergänzen? l0b0 vor 5 Jahren 1
Bitte klären Sie: Möchten Sie (1) ein Verzeichnis wie `. / Unknown / partial / path / foo / moo / doo` finden? oder (2) der längste existierende Pfad aus dem Satz `. / foo / moo / doo`,`. / foo / moo`, `. / foo`,` .`? oder (3) noch etwas? Kamil Maciorowski vor 5 Jahren 0
@ KamilMaciorowski Ich muss den Pfad von innen nach außen durchlaufen, was bedeutet, mit "doo" zu beginnen. Wenn ich ein im Pfad vorhandenes Verzeichnis erreiche, muss ich aufhören und dann die Schreibberechtigungen überprüfen. Ich kann nicht vorhandene Ordner auf Schreibberechtigungen überprüfen. Der Pfad kann beliebig sein, da der Skriptbenutzer ihn angibt. Jocky Doe vor 5 Jahren 0
So wie (2), richtig? Kamil Maciorowski vor 5 Jahren 0
@KamilMaciorowski Ja wie (2) Jocky Doe vor 5 Jahren 0
tut `if [[-d" $ dirpath "]]; dann echo "$ dirpath ist ein Verzeichnis"; fi` was du brauchst? Ich finde Ihre Problembeschreibung immer noch sehr unklar. glenn jackman vor 5 Jahren 0
@glennjackman Das Verzeichnis ist möglicherweise nicht vorhanden. Daher muss ich eine Schleife durchlaufen, bis ich im Pfad ein vorhandenes Verzeichnis finde und dann die Schreibberechtigung für den Rest nicht vorhanden sehe Jocky Doe vor 5 Jahren 0
"um den Rest nicht zu erstellen" - siehe `mkdir -p`. Kamil Maciorowski vor 5 Jahren 1
@KamilMaciorowski Aber wie prüfe ich, ob ich Schreibrechte für den Pfad habe? Ich führe Skripte von Drittanbietern im Verzeichnis aus, also keinen Superbenutzer. Jocky Doe vor 5 Jahren 0
Wenn Sie keine Schreibberechtigung haben, können Sie den Rest nicht "erstellen", oder? Es sei denn, das nicht beschreibbare Verzeichnis ist leer und Sie können es entfernen. oder es ist dein Verzeichnis und du kannst dir selbst Berechtigungen geben. Wenn ich Sie wäre, würde ich [KISS] (https://en.wikipedia.org/wiki/KISS_principle). Wenn "mkdir -p" "Berechtigung verweigert" zurückgibt, wird davon ausgegangen, dass die Berechtigungen so sind, wie sie sind, und das beste, was Ihr Skript tun kann, ist, einen Fehler auszulösen. dann untersuchst du von hand. Jede umständliche Skriptlogik kann nach hinten losgehen. Kamil Maciorowski vor 5 Jahren 1

2 Antworten auf die Frage

1
Ljm Dullaart

Nur eine schnelle Lösung

#!/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=$ if [ "$dir" = "" ] ; then echo "You are not allowed to write anywhere." stop=yes fi fi done 
10x Ihre Antwort hat mir geholfen, eine Funktion zu erstellen, die diese Aufgabe erfüllt Jocky Doe vor 5 Jahren 0
Wenn das Problem dadurch gelöst wurde, markieren Sie die Lösung als solche. Ljm Dullaart vor 5 Jahren 0
0
Jocky Doe

Hier ist eine Funktion, die das erste vorhandene Verzeichnis in einem Pfad findet, der an der tiefsten Stelle im Pfad beginnt.

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

Hier ist ein Anwendungsbeispiel

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