我正在运行一个 BBS。我从DOS移植到Linux的一个软件。冲动论坛。我的消息库文件有问题。问题是,.BRD
由于某种原因,它删除了文件,从而导致系统停止运行。并导致 BBS 崩溃。我需要找到一种方法来.BRD
在丢失时创建这些文件。这是我写的一个脚本:
#!/bin/bash
inotifywait --daemon --outfile /home/imp/imp/test.log -m /home/imp/imp/msgs -e create
while read path action file; do
echo "The file '$file' appeared in directory '$path' via '$action'"
for name in /home/imp/imp/msgs/*.MIX; do
touch "${name}.BRD"
done
done
但它似乎不起作用。它实际上不是touch
文件.BRD
。这些.BRD
文件的大小可以是 0 字节长度。我使用它是inotifywait
因为这似乎是解决这种情况的最佳方法。我还有其他使用的脚本inotifywait
,它们非常适合我的需求。
答案1
如果不过多查看inotifywait
代码,看起来循环的内部部分会根据变量中的内容接触文件name
:
for name in /home/imp/imp/msgs/*.MIX; do
touch "${name}.BRD"
done
的值$name
将是一个路径名,末尾带有.MIX
文件名后缀。
触摸$name.BRD
将创建一个带有文件名后缀的文件.MIX.BRD
,而我相信您可能想要原始.MIX
后缀被取代经过.BRD
。
这是这样做的:
for name in /home/imp/imp/msgs/*.MIX; do
touch "${name%.MIX}.BRD"
done
${name%.MIX}
.MIX
从 的值的末尾删除$name
。
该代码可能还缺少命令|
末尾的a inotifywait
,以便能够将其输出输入while read
循环中:
#!/bin/sh
inotifywait --daemon --outfile /home/imp/imp/test.log -m /home/imp/imp/msgs -e create |
while read path action file; do
printf 'The file "%s" appeared in directory "%s" via "%s"\n' "$file" "$path" "$action"
for name in "$path"/*.MIX; do
touch "${name%.MIX}.BRD"
done
done
在这里,我还冒昧地将 更改echo
为 a printf
(因为它输出变量数据),并$path
在内for
循环中使用,我希望这是正确的。该代码没有使用任何特殊功能,因此我也bash
更改了 shell 。/bin/sh
根据inotifywait
工作方式、内容$file
以及您想要执行的操作,根据$file
目录中的所有文件来触摸文件可能就足够了,而不是循环遍历目录中的所有文件。