%20de%20elementos%20en%20una%20carpeta%3F.png)
Hay una carpeta que se está creando dentro de otra carpeta en mi directorio de inicio y quiero poder analizar el contenido de esta carpeta; sin embargo, tengo un problema: cuando se crea la carpeta, el administrador la elimina inmediatamente. mismo programa que lo crea. ¿Hay alguna manera de permitirle crear la carpeta, pero luego no eliminarla? Estoy ejecutando Ubuntu GNOME 15.10 con GNOME 3.18.
Respuesta1
No hay configuraciones de permisos que puedan hacer esto, incluso usando ACL, pero puedes competir con el programa usando inotifywait
:
En una terminal, ejecuté:
while sleep 0.5; do if mkdir foo/bar; then echo foo; rmdir foo/bar; fi; done
Como puede ver, esto crea un directorio, repite un mensaje y elimina el directorio; todo esto sucede muy rápidamente según los estándares humanos.
Y en otro:
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
Este comando espera la creación de algo en foo
, luego elimina los permisos de escritura foo
y prueba si llegó a tiempo para capturar el subdirectorio. De lo contrario, vuelve a agregar el permiso de escritura y comienza de nuevo.
Después de esperar un poco:
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
Esto se basa en uncondición de carrera, así que si puedes atraparlo es cuestión de suerte.
foo/bar
es el directorio que crea el programa. Si no sabes el nombre, puedes probar de otras formas:
asegúrese de que no haya nada más en el directorio, de modo que cuando se cree un subdirectorio,
foo/
no esté vacío. Algunas pruebas para directorios no vacíos están disponibles enesta publicación de U&L:shopt -s nullglob if [ -n "$(ls -A foo/)" ] then break
Esto funcionó lo suficientemente rápido.
lea el nombre del directorio creado en
inotifywait
la salida de:if dir=$(inotifywait -e create --format '%f' foo) then chmod -w foo if [[ -d foo/$dir ]]
Esto no funcionó (todavía) para mí; la sobrecarga de crear una subcapa parece hacerla lo suficientemente lenta como para que el otro bucle gane cada vez. Quizás codificado en C usando la
inotify
API, esto podría funcionar.