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