¿Cómo evitar la eliminación (pero no la creación) de elementos en una carpeta?

¿Cómo evitar la eliminación (pero no la creación) de elementos en una carpeta?

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 fooy 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/bares 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 inotifywaitla 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 inotifyAPI, esto podría funcionar.

información relacionada