我的主目录中有一个文件夹正在另一个文件夹中创建,我希望能够分析此文件夹的内容,但是,我遇到了一个问题:创建文件夹后,创建它的同一程序会立即将其删除。有什么方法可以允许它创建文件夹,但不删除它?我正在运行带有 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
,这可以起作用。