需要帮助修复此inotifywait bash脚本吗
我正在尝试设置inotifywait脚本以执行此操作:需要帮助修复此inotifywait bash脚本吗,bash,inotifywait,Bash,Inotifywait,我正在尝试设置inotifywait脚本以执行此操作: 步骤1:创建目录,将文件放入其中,这会触发 inotifywatch to fire执行步骤2 第二步:30分钟后 已移动目录,并将创建一个符号链接返回到旧根目录 目录 到目前为止,这就是我所拥有的,但它并不完全有效。这是从我在网上找到的不同例子中拼凑而成的 inotify.sh: #!/bin/sh cd ~/automove/old/ inotifywait -m -e close_write --format %w%f . |
- 步骤1:创建目录,将文件放入其中,这会触发 inotifywatch to fire执行步骤2
- 第二步:30分钟后 已移动目录,并将创建一个符号链接返回到旧根目录 目录
#!/bin/sh
cd ~/automove/old/
inotifywait -m -e close_write --format %w%f . | while IFS= read -r file; do
echo $file
sleep 15
sh ~/automove/move.sh "$file" ~/automove/new/
done
move.sh:
#!/bin/sh
original="$1" target="$2"
if [ -d "$target" ]; then
target="$target/${original##*/}"
fi
mv -- "$original" "$target"
ln -s -- "$target" "$original"
我的问题如下:
- 带有“撇号”的目录会损坏李>
- 似乎inotifywait将在新的符号链接上触发,从而创建一个无休止的循环
- 如果一个目录触发inotifywait,然后它休眠15秒(我设置为测试,实际上我需要30分钟),然后 然后,在原来的15秒结束之前,另一个目录出现, 它甚至不会开始第二次15秒的睡眠,直到第一次睡眠结束 完成了
有人能告诉我如何修改它以满足我的需要吗?用
#开始你的脚本/bin/bash
而不是#!bin/sh
将确保您确实在使用bash(我认为您的一些构造是特定于bash的)。您可能需要添加-ue
,以确保问题不是由变量引用或命令的静默失败引起的
--
“损坏”目录
你能更具体地说一下发生了什么吗
--
“分别等待15秒”
通过管道将inotifywait
的输出传送到while
循环。管道的每一侧都是一个单独的过程。如果我理解正确,您希望循环在不等待的情况下继续到下一个迭代,同时在执行其余语句之前分别等待15秒
为此,您需要创建一个额外的进程来执行sleep
和以下语句。将循环内的语句括在括号内,并在结束括号后添加&
,如下所示:
{
echo $file
sleep 15
sh ~/automove/move.sh "$file" ~/automove/new/
} &
您可以选择将这些语句放在函数中,并从循环中调用该函数,后跟相同的&
字符(在后台执行的单独进程中执行该语句)
您可能希望在脚本末尾添加一个wait
语句,以便它在实际将控制权交还给启动它的进程之前,等待所有子进程结束
--
无止境循环:我还没有测试,但是inotifywait
可能会在创建符号链接时触发。您可能希望您的循环如下所示:
do
if
! [ -d "$file" ] || [ -L "$file" ]
then
continue
fi
(followed by the code suggested above...)
done
当目标文件不是目录时,此代码将绕过循环中的其余代码并跳到下一个迭代
注意:[-d“$file”]
在测试指向目录的符号链接时,似乎返回0(true),因此我建议的测试确保文件是目录而不是符号链接
--
请注意,我没有测试您的代码或我建议的代码
我希望这有帮助