shell - 检查文件是否存在于另一个位置,然后根据 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 中。
请帮忙。
提前致谢。
解决方案
可以使用类似的东西:
for i in /outbound/*.csv;do [[ $(($(date +"%s")-$(stat -c %Y $i))) -lt 3600 && ! -e /processed/${i##*/} ]] && cp $i /daily/;done
推荐阅读
- jquery - 为什么在单击事件后聚焦时不应用浏览器默认聚焦样式?
- python - Badrequestkeyerror robobrowser
- r - eulerr 包中的调色板
- sql - 删除并重新创建引用多列的外键
- scala - 循环通过scala数据框将值放入sparksql select的变量中
- java - 如何使用带有 Java Spring 的 Azure 应用服务证书来启用 SSL
- javascript - 如何在 GeoEvent Manager 中选择正确的连接器以及幕后发生了什么?
- javascript - 地址文本区域元素不会在 Firefox 中自动填充
- postgresql - Oracle 在 Postgres 中的 user_external_locations 等效项
- java - JSON 模式验证 - Java POJO 与单独的 .json 文件