需要帮助修复此inotifywait bash脚本吗

需要帮助修复此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 . |

我正在尝试设置inotifywait脚本以执行此操作:

  • 步骤1:创建目录,将文件放入其中,这会触发 inotifywatch to fire执行步骤2
  • 第二步:30分钟后 已移动目录,并将创建一个符号链接返回到旧根目录 目录
到目前为止,这就是我所拥有的,但它并不完全有效。这是从我在网上找到的不同例子中拼凑而成的

inotify.sh:

#!/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秒的睡眠,直到第一次睡眠结束 完成了
我需要为每个inotifywait匹配分别触发睡眠。
有人能告诉我如何修改它以满足我的需要吗?

#开始你的脚本/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),因此我建议的测试确保文件是目录而不是符号链接

--

请注意,我没有测试您的代码或我建议的代码

我希望这有帮助