0

我有一个 shell 脚本,它列出了文件夹的文件,然后对它们执行操作(打印成 PDF),但我经常得到一个空白的 PDF。如果我删除生成的 PDF,则始终会正确生成新的 PDF。

我的印象是因为我的脚本在文件完全复制之前开始打印(副本是通过操作系统资源管理器制作的,另存为,或者只是复制粘贴)。

当有人添加新文件时,绝对不是我来管理,副本来自使用网络共享的用户。

那么有没有办法拥有这样的东西?

for inputFile in `ls -l $SearchPattern | grep ^- | awk '{print $9}'`
do
   //CHECK_THAT_THE_FILE_HAS_ALREADY_BEEN_FULLY_SAVED_ONCE 
   //DO_MY_PRINT_HERE
done
4

4 回答 4

3

如果您在 Linux 下运行并且文件系统是服务器本地的,那么您可以使用inotify子系统等到文件关闭然后触发操作。inotify -tools包包括inotifywait程序,它将 inotify 功能公开给 shell 脚本。

例如,您可以close_write在这样的目录中监视事件:

inotifywait -e close_write -m /path/to/directory

运行此命令,执行以下操作:

echo hello > /path/to/directory/file

将生成如下输出:

/path/to/directory/ CLOSE_WRITE,CLOSE hello

所以你有生成事件的目录和文件名。在 shell 脚本中,您可以将其通过管道传输到循环中:

inotifywait -e close_write -m /path/to/directory | while read dir flags file; do
  ...do something with the file...
done
于 2012-05-07T13:10:00.137 回答
2

正如有人指出的那样,使用文件修改时间可能很有用。我很快就完成了这个可能有用的脚本。它将等到自给定文件的最后修改时间以来经过 5 秒:

#!/bin/bash

function getTimeFromLastChange() {
    file=${1}
    let lastAccess=$(stat --format=%Y ${file})
    let now=$(date +%s)
    let timePassed=$((now - lastAccess))
    echo ${timePassed}
}

file=./test
while [ true ]; do
    let lastChange=$(getTimeFromLastChange ${file})
    if [ "${lastChange}" -lt 5 ]; then
        echo "waiting"
        sleep 1
    else
        echo "done"
        exit
    fi
done

echo ${timePassed}

这里的关键是“getTimeFromLastChange”函数,它使用 stat (http://linux.die.net/man/1/stat) 获取给定文件自 unix 纪元时间以来的最后修改时间(以秒为单位)。然后,它将使用日期 (http://linux.die.net/man/1/date) 获取当前时间(同样,自 unix 纪元时间以来的秒数),减去它们,并计算自以来的总秒数最后修改时间。

主循环将等到一些“安全”的秒数过去。因此,您可以尝试调整此参数并打印几秒钟前写入/修改的文件。

示例运行:

marcelog@host ~ $ touch ./test
marcelog@host ~ $ ./try.sh
waiting
waiting
waiting
done

这不是 100% 安全的。但我认为值得一试。

希望能帮助到你!

于 2012-05-07T13:20:31.763 回答
0

您应该检查数据的修改时间并对此设置阈值。没有其他(简单)方法可以查看文件上是否没有更多操作未决。

所以你应该使用

ls -l -t

在您找到上面的语句并根据您的时间阈值通过“排序”进行管道传输。

问候

于 2012-05-07T13:08:48.710 回答
0

我结束了使用

for inputFile in `find $SearchPattern2 -maxdepth 1 -type f -cmin +1 -iname "*.pdf"`

-cmin +1 表示查找,即只列出修改时间>1分钟前的文件。

它不是 100% 安全的,但它会以很大的利润处理我所有的情况。

我没有找到如何在几秒钟内做到这一点

于 2012-05-09T10:40:46.340 回答