如何防止删除(但不创建)文件夹中的项目?

如何防止删除(但不创建)文件夹中的项目?

我的主目录中有一个文件夹正在另一个文件夹中创建,我希望能够分析此文件夹的内容,但是,我遇到了一个问题:创建文件夹后,创建它的同一程序会立即将其删除。有什么方法可以允许它创建文件夹,但不删除它?我正在运行带有 GNOME 3.18 的 Ubuntu GNOME 15.10。

答案1

没有权限设置可以做到这一点,即使使用 ACL,但你可以与程序进行竞赛,使用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 ]]
    

    对我来说,这还不起作用;创建子 shell 的开销似乎使其足够慢,以至于每次另一个循环都能获胜。也许使用 API 用 C 编写代码inotify,这可以起作用。

相关内容