【问题标题】:bash: corrupted files after cp and mv commandsbash:在 cp 和 mv 命令后损坏的文件
【发布时间】:2022-01-27 20:00:09
【问题描述】:

我正在使用计划的 bash 脚本(每分钟执行一次 bash 脚本)查看我的 Synology 上的一个文件夹,所有扫描的文档都将被删除。我的想法是将它们移动到两个地方,一个是无纸化文件夹和一个未排序的文件夹,这样我可以手动将它们移动到正确的文件夹。

#!/bin/bash
dpath=/volume1/scanned/*
for FILE in $dpath
do
if [[ -f $FILE ]]
then
    cp $FILE /volume1/unsorted_documents/
    mv $FILE /volume1/docker/paperless/consume/
else
    echo “There are no files in the given path.”
fi
done

此脚本在大多数情况下最终导致文档损坏。我的想法是在执行移动命令之前它还没有完成复制。

有没有办法在执行移动之前确保复制完成?或者其他更好的解决方案?

【问题讨论】:

  • 损坏了怎么办?您的文件名是否包含空格?
  • @BenjaminW。已损坏,好像复制的 pdf 文件无法再打开一样。移动的文件似乎很好
  • 是的,听起来您在完成下载之前正在处理文件;如果源无法生成辅助文件(例如,downloaded.file.DONE - 您只处理存在关联.DONE 的文件),那么另一个选项是检查大小(wc -c),等待 n 秒,看看是否尺寸发生了变化;一种变化是记下每个文件的当前大小,将详细信息写入文件并在下一个脚本运行时,如果文件的大小没有改变(从上次脚本运行开始),然后处理它并从文件中删除(文件名列表和尺寸)...
  • 由于您的脚本每分钟都在运行,我假设您无需“急于”处理文件,您可以多等一分钟以验证其大小没有变化
  • cpmv 运行之前完成,但是您的脚本是否可能在一分钟内没有完成,这意味着您的脚本的第二个实例在前一个完成之前启动?跨度>

标签: bash cron


【解决方案1】:

我认为您的问题与 dpath 变量分配有关。尝试使用find 获取文件列表

#!/bin/bash
dpath=$(find /volume1/scanned -maxdepth 1 -type f)
# dpath=/volume1/scanned/*
for FILE in $dpath; do
  cp "$FILE" /volume1/unsorted_documents/
  mv "$FILE" /volume1/docker/paperless/consume/
done

【讨论】:

  • 那仍然是一个字符串并且依赖于分词。更强大的方法是使用数组,请参阅 this Q&A,并结合引用 all 扩展。
  • 哦,我明白了,您认为$FILE 中的空格会导致损坏吗??
  • 文件名是由我的 kyocera 打印机/扫描仪生成的,因此它们不包含任何空格。奇怪的是 cp 命令原来没有任何问题,但 mv 变成了损坏的文件。不是每次,但有时
  • 空白会导致尝试访问不存在的文件,我会说。
  • 顺便说一句,它们是什么类型的文件??我很想知道file $FILE 输出什么
【解决方案2】:

感谢您的所有回答!我考虑了每个答案并编写了另一个脚本,它应该会更好。如果有什么cmets或者推荐,请告诉我:https://gist.github.com/ErikvdVen/95009cc0fd9267deaeae6ddbeae31e54

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2012-07-02
    • 2014-01-24
    • 2018-11-18
    相关资源
    最近更新 更多