通过http与远程机器同步,并删除旧文件

通过http与远程机器同步,并删除旧文件

我的系统(ubuntu)中有一个文件夹,它使用wget.文件名采用以下格式:A156.0.1.x、A156.0.y、A156.0.z、A156.0.a、A156.0.b。所有文件都是在我办公室的某个时间创建的,并且都具有相同的时间和日期。不允许 Rsync 和任何其他与办公室的连接。

我每天同步 4 次,并且没有关于创建文件的频率的模式。文件夹可能几周没有变化,也可能一天变化 10 次。新文件创建后,其名称将类似于 A156.1.[a,b,x,y,z]。每个文件都很大(~500MB)。

因此,我的系统中将不再有一组以上的文件 (5),总共有 10 个文件×500MB = 5GB。

是否有任何简单的脚本可以由 cron 运行来频繁检查文件夹并删除旧文件?所以我最终只会得到最新的 5 套。我可以运行诸如删除早于 x 天的文件之类的操作,但我们永远不确定何时会创建下一组文件。

答案1

您可以使用find管道sort进入列出按日期排序的文件,然后cut在输出上使用生成文件列表,然后使用rm删除除最新 5 个文件之外的所有文件。定期运行此操作应该会得到您正在寻找的结果。

我不知道现有的脚本,但这应该是相当简单的实现。

答案2

如果你可以使用 zsh,它有全局限定符这使得这变得很容易:

zsh -c 'rm work-folder/*(om[6,-1])'

这表示选择工作文件夹目录中的所有文件,o按修改时间排序m,并且进一步选择仅从 6 到末尾的范围。这将在文件夹中留下最新的 5 个文件。

假设目录中有 6 个或更多文件;您可以围绕删除进行测试以更安全(全部在 zsh 中):

files=(work/*(om))
[ ${#files[@]} -gt 5 ] && echo rm "${files[6,-1]}"

bash 的工作量更大,因为您需要调用stat每个文件并自己跟踪这条线

答案3

以下脚本将显示目录中“新文件”和“旧文件”的列表。 “新文件”是指在上次运行脚本之后已修改的文件,“旧文件”是指自上次运行脚本以来尚未修改的文件。

该脚本将输出写入date“时间戳文件”,并在下次运行中使用该文件来确定哪些文件已更改。第一次运行时,不会产生任何输出。

该脚本应该手动运行,并且在编写时它只会给您一个机会探测特定目录中的哪些文件已被修改。

#!/bin/sh

topdir=$HOME  # change this to point to the top dir where your files are

stamp="$topdir/timestamp"

if [ -f "$stamp" ]; then
    echo 'New files:'
    find "$topdir" -type f ! -name timestamp -newer "$stamp"

    echo 'Old files:'
    find "$topdir" -type f ! -name timestamp ! -newer "$stamp"
fi

date >"$stamp"

这可以修改为

  • 提示用户删除旧文件,
  • 仅检测与特定模式匹配的文件(使用-name 'pattern',例如-name 'A156.1.[abxyz]'),
  • 查看inode更改时间(“ctime”)而不是修改时间(使用-cnewer而不是-newer如果您find支持它),
  • ETC。

相关内容