关于Unix Move命令

关于Unix Move命令

我需要编写一个 Unix Shell 脚本 tran.sh,将 csv 输入文件从 /exp/files 文件夹移动到 /exp/ready 目录。

/exp/filescsv 输入文件由 FTP 服务器写入文件夹,而我无法轻易更改其行为。在tran.shshell 脚本中,我需要确保在将该 csv 输入文件从 /exp/files 目录移动之前,不再有任何其他进程写入该文件。

我该怎么做。

答案1

没有可移植的方法来实现这一点。不过你可以尝试、、、和fuser其他方法。lsofinotifyFAM

答案2

尝试使用fuser [FILE]。如果文件未被使用,它将返回非零。

以下是等待文件准备好移动的一些示例代码:

#!/bin/sh

FROMDIR='/exp/files'
DESTDIR='/exp/ready'

function move_file_if_ready () {
    if [ -f "$1" ]; then
        while fuser "$1" 2>/dev/null 1>&2 ; do
            sleep 1
        done

        mv "$1" "$DESTDIR"
    fi
}

for "$fn" in "$FROMDIR"/*.csv; do
    move_file_if_ready "$fn"
done

答案3

你可以使用 lsof

r=$(lsof /exp/files )
if [ ! -z "$r" ] ;then
  mv /exp/files/*csv /exp/ready
fi

答案4

我认为,如果不修改创建这些文件的进程,您就无法做到这一点。每当我们的系统中有这样的任务时,我们都会确保创建文件的进程在最后将其设置为可执行文件。因此,将移动或以其他方式进行后续处理的进程可以检查这些文件的可执行位,以确保原始进程已完成对文件的处理。

相关内容