Существует папка, которая создается в другой папке в моем корневом каталоге, и я хочу смочь проанализировать содержание этой папки, однако, у меня есть проблема: поскольку папка создается, она затем сразу удалена той же программой, которая создает ее. Есть ли какой-либо способ, которым я могу позволить этому создавать папку, но затем не удалять его? Я выполняю Ubuntu GNOME 15.10 с GNOME 3.18.
Нет никаких настроек разрешения, которые могут сделать это, даже с помощью ACLs, но у Вас может быть гонка с программой, с помощью inotifywait
:
В одном терминале я работал:
while sleep 0.5; do if mkdir foo/bar; then echo foo; rmdir foo/bar; fi; done
Как Вы видите, это создает каталог, повторяет сообщение и удаляет каталог - весь из которого происходит очень быстро по человеческим стандартам.
И в другом:
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
Эта команда ожидает создания чего-либо в 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
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
Это полагается на состояние состязания, поэтому можно ли поймать его, вопрос удачи.
foo/bar
каталог, который делает программа. Если Вы не знаете название его, можно попробовать другие пути:
удостоверьтесь, что нет ничего иного в каталоге, поэтому когда подкаталог создается, foo/
непусто. Некоторые тесты для непустого каталога доступны в этом сообщении U&L:
shopt -s nullglob
if [ -n "$(ls -A foo/)" ]
then
break
Это работало достаточно быстро.
считайте название созданного каталога от inotifywait
вывод:
if dir=$(inotifywait -e create --format '%f' foo)
then
chmod -w foo
if [[ -d foo/$dir ]]
Это (еще) не работало на меня; издержки создания подоболочки, кажется, делают его просто достаточно достаточно медленным, чтобы другой цикл победил каждый раз. Возможно, кодированный в использовании C inotify
API, это могло работать.