%20von%20Elementen%20in%20einem%20Ordner%20verhindert%20werden%3F.png)
In meinem Home-Verzeichnis wird ein Ordner in einem anderen Ordner erstellt, und ich möchte den Inhalt dieses Ordners analysieren können. Allerdings habe ich ein Problem: Wenn der Ordner erstellt wird, wird er sofort von demselben Programm gelöscht, das ihn erstellt hat. Gibt es eine Möglichkeit, dass ich zulassen kann, dass der Ordner erstellt wird, ihn dann aber nicht löscht? Ich verwende Ubuntu GNOME 15.10 mit GNOME 3.18.
Antwort1
Es gibt keine Berechtigungseinstellungen, die dies ermöglichen, auch nicht mit ACLs, aber Sie können mit dem Programm konkurrieren, indem Sie Folgendes verwenden inotifywait
:
In einem Terminal habe ich Folgendes ausgeführt:
while sleep 0.5; do if mkdir foo/bar; then echo foo; rmdir foo/bar; fi; done
Wie Sie sehen, wird dadurch ein Verzeichnis erstellt, eine Meldung ausgegeben und das Verzeichnis entfernt – und das alles geschieht für menschliche Verhältnisse sehr schnell.
Und in einer anderen:
while true
do
if inotifywait -e create foo
then
chmod -w foo
if [[ -d foo/bar ]]
then
break
else
chmod +w foo
fi
fi
done
Dieser Befehl wartet auf die Erstellung von irgendetwas in foo
, entfernt dann die Schreibberechtigung von foo
und prüft, ob es rechtzeitig war, das Unterverzeichnis zu erfassen. Wenn nicht, fügt er die Schreibberechtigung wieder hinzu und beginnt erneut.
Nach kurzem Warten:
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
rmdir: failed to remove ‘foo/bar’: Permission denied
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
Dies beruht auf einerRennbedingung, es ist also Glückssache, ob Sie es fangen können.
foo/bar
ist das Verzeichnis, das das Programm erstellt. Wenn Sie den Namen nicht kennen, können Sie es auf andere Weise versuchen:
Stellen Sie sicher, dass sich nichts anderes im Verzeichnis befindet, sodass beim Erstellen eines Unterverzeichnisses dieses
foo/
nicht leer ist. Einige Tests für nicht leere Verzeichnisse finden Sie indieser U&L-Beitrag:shopt -s nullglob if [ -n "$(ls -A foo/)" ] then break
Das hat schnell genug geklappt.
Lesen Sie den Namen des erstellten Verzeichnisses aus
inotifywait
der Ausgabe von :if dir=$(inotifywait -e create --format '%f' foo) then chmod -w foo if [[ -d foo/$dir ]]
Das hat bei mir (noch) nicht funktioniert; der Aufwand für die Erstellung der Subshell scheint es gerade langsam genug zu machen, damit die andere Schleife jedes Mal gewinnt. Vielleicht
inotify
könnte das funktionieren, wenn es in C unter Verwendung der API codiert wird.