Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 对于每个文件修改,将其复制到另一个文件bash中_Linux_Bash_Inotifywait - Fatal编程技术网

Linux 对于每个文件修改,将其复制到另一个文件bash中

Linux 对于每个文件修改,将其复制到另一个文件bash中,linux,bash,inotifywait,Linux,Bash,Inotifywait,我想运行服务来监听文件修改,并在每次添加到文件时将其从文件中删除并附加到另一个文件中 我试过这段代码,但它不能像无限循环一样工作 inotifywait -m -e modify "$1" | while read folder eventlist eventfile do cat "$1">>$DESTINATION_FILE >$1 done 每次截断文件时,都会注册为修改,从而触发另一次截断,等等。请尝试测

我想运行服务来监听文件修改,并在每次添加到文件时将其从文件中删除并附加到另一个文件中 我试过这段代码,但它不能像无限循环一样工作

   inotifywait -m -e modify "$1" |
    while read folder eventlist eventfile
    do
        cat "$1">>$DESTINATION_FILE
        >$1
    done 

每次截断文件时,都会注册为修改,从而触发另一次截断,等等。请尝试测试文件是否包含循环体中的任何内容

inotifywait -m -e modify "$1" |
while read folder eventlist eventfile
do
    # Only copy-and-clear if the file is not empty
    if [ -s "$1" ]; then
        cat "$1" >> "$DESTINATION_FILE"
        # What if the file is modified here?
        >$1
    fi
done

请参阅我在
cat
和截断之间的注释。您永远不会将这些修改放在
$DESTINATION_文件中
,因为您会在循环的下一次迭代之前删除它们。这并不是完全可以避免的,除非您的操作系统允许您在
cat
之前获得
$1
上的锁,然后在截断后释放锁,这样一次只能有一个进程写入文件。

每次截断文件时,该进程会注册为修改,从而触发另一次截断,等等。尝试测试文件在循环体中是否包含任何内容

inotifywait -m -e modify "$1" |
while read folder eventlist eventfile
do
    # Only copy-and-clear if the file is not empty
    if [ -s "$1" ]; then
        cat "$1" >> "$DESTINATION_FILE"
        # What if the file is modified here?
        >$1
    fi
done

请参阅我在
cat
和截断之间的注释。您永远不会将这些修改放在
$DESTINATION_文件中
,因为您会在循环的下一次迭代之前删除它们。这并不是真的可以避免的,除非您的操作系统允许您在
cat
之前获得
$1
上的锁,然后在截断后释放锁,这样一次只能有一个进程写入文件。

正如chepner所指出的,恢复更改也将被视为文件修改

解决办法是:

  • 删除-m参数
  • 在bash中手动实现while循环
  • e、 g

    注意:我自己还没有测试过上面的代码


    注2:可能存在原子性问题。有时不监视文件修改。因此,当此
    cat>
    操作或
    cp
    操作正在进行时,可能有人试图写入
    “$1”
    文件,这将丢失。

    正如chepner所指出的,恢复更改也将被视为文件修改

    解决办法是:

  • 删除-m参数
  • 在bash中手动实现while循环
  • e、 g

    注意:我自己还没有测试过上面的代码


    注2:可能存在原子性问题。有时不监视文件修改。因此,当此
    cat>
    操作或
    cp
    操作正在进行时,可能有人试图写入
    “$1”
    文件,但该文件将丢失。

    为什么要这样做?基本上可以对许多文件进行修改,每次修改都要将差异附加到
    $DESTINATION\u文件
    ?为什么要这样做?对许多文件进行修改基本上,每次修改都要将差异附加到
    $DESTINATION\u文件