首页 > 解决方案 > 检查文件是否存在于另一个位置,然后根据 Unix 中的条件复制文件

问题描述

有一个文件夹,用户在其中随机放置文件。这些文件都是只读的。我们需要每小时读取一次文件,如果最近一小时内有文件,我们需要将其复制(而不是删除或更改)到另一个目录。这些文件通常是模式 Bank_YYMMDD.csv,其中 YYMMDD 是变量,例如:Bank_20200927.csv。

/outbound 是放置文件的位置,/daily 是需要复制文件的位置。我已经尝试了下面的代码,它工作正常。

find /outbound -type f -mmin -60 -name "Bank*" | xargs -ILIST cp LIST /daily/

问题部分:一旦文件被放置在 /daily 中,一个单独的业务流程会检查并处理这些文件,并在处理后将它们移动到 /processed。还有一个额外的要求是检查已处理的文件夹,即 /processed,如果我们尝试放置的文件已经存在于 /processed 文件夹中,则不要将此文件复制到 /daily。

例如:在 /outbound 的最后一小时内放置或修改了 3 个文件假设 3 个文件是 Bank_20200927.csv、Bank_20200926.csv 和 Bank_20200925.csv。在这 3 个文件中,该过程运行得较早,并且已经选择了 Bank_20200926.csv 和 Bank_20200925.csv 并将它们放在 /daily 中。然后业务流程运行,现在 /processed 文件夹已经包含 Bank_20200926.csv 和 Bank_20200925.csv。

因此,这一次即使 Bank_20200926.csv 和 Bank_20200925.csv 在被修改并满足最近一小时内的修改时被选中,但要复制到 /daily 文件夹的唯一文件将是 Bank_20200927.csv。

我坚持检查 /processed 是否有文件,如果没有,则将其放在 /daily 中。

请帮忙。

提前致谢。

标签: shellunixsh

解决方案


可以使用类似的东西:

for i in /outbound/*.csv;do [[ $(($(date +"%s")-$(stat -c %Y $i))) -lt 3600 && ! -e /processed/${i##*/} ]] && cp $i /daily/;done

推荐阅读