【问题标题】:how to delete 3 days old files using ftp in a shell script (Solaris OS)如何在 shell 脚本(Solaris OS)中使用 ftp 删除 3 天前的文件
【发布时间】:2011-01-10 07:29:51
【问题描述】:

我正在编写一个脚本来创建基本上是某些表的副本的文件,并将这些文件通过 ftp 传输到远程计算机。在转储这些文件之前,还需要删除远程计算机上 3 天的旧文件。

我需要帮助编写 ksh 以使用 ftp 在远程计算机上删除 3 天前的文件

【问题讨论】:

    标签: unix ftp shell solaris


    【解决方案1】:

    通常,您会使用:

    find . -mtime +3 -exec rm {} ';'
    

    或类似的东西(即,可能有其他限制条款,如-type f 用于常规文件或-maxdepth 0 仅用于当前目录,没有子目录)。 -mtime +3 只获取那些修改日期为 3 天或更长时间的文件。

    在您的系统上执行man find 以获取完整详细信息。我不知道 Solaris 是否具有与 GNU 相同的功能。它可能更有限(或更好)。


    更新:请以你崇拜的任何神灵的名义,先用echo而不是rm测试命令。如果您相信“网络上某个随机的家伙可能会或可能不会将您的最大利益放在心上”的建议,我对破坏您的文件不承担任何责任:-)


    而且,在有人插手指责我没有使用xargs(或者,更好的是,find -print0xargs -0 可用时)之前,我知道。但这与手头的具体问题无关。当find -exec 的性能出现问题时,OP 可以提出另一个问题。


    如果您有一个带有日期的特定文件格式(正如您在评论中指出的那样),您可以实际上在ftp 下使用mdel。考虑以下脚本:

    # The prefix and suffix of files to delete.
    prefix='*_'
    suffix='-i.tbl'
    
    # Create FTP script file.
    rm -rf temp.ftp
    echo "user pax pax_password" >>temp.ftp
    echo "cd /my/directory" >>temp.ftp
    echo "prompt" >>temp.ftp
    
    # Get current date.
    y=$(date +%Y)
    m=$(date +%m)
    d=$(date +%d)
    ((lasty = y - 1))
    ((lastm = m - 1))
    
    # If past Jan 3, delete all of previous year.
    if [[ $m -gt 1 || $d -gt 3 ]] ; then
        echo "mdel ${prefix}${lasty}????${suffix}" >>temp.ftp
    fi
    
    # If past Jan and past the third, delete all of previous month.
    if [[ $m -gt 1 && $d -gt 3 ]] ; then
        if [[ ${lastm} -lt 10 ]] ; then
            echo "mdel ${prefix}${y}0${lastm}??${suffix}" >>temp.ftp
        else
            echo "mdel ${prefix}${y}${lastm}??${suffix}" >>temp.ftp
        fi
    fi
    
    # If past the third, delete current month more than three days old.
    if [[ $d -gt 3 ]] ; then
        ((d = d - 3))
        if [[ ${m} -lt 10 ]] ; then
            m="0${m}"
        fi
        while [[ ${d} -gt 0 ]] ; do
            if [[ ${d} -lt 10 ]] ; then
                echo "mdel ${prefix}${y}${m}0${d}${suffix}" >>temp.ftp
            else
                echo "mdel ${prefix}${y}${m}${d}${suffix}" >>temp.ftp
            fi
            ((d = d - 1))
        done
    fi
    
    # Finalise script and run it.
    echo "bye" >>temp.ftp
    ftp -n mymachine.com <temp.ftp
    rm -rf temp.ftp
    

    除了有点烦人的情况外,您可能会在一个月的界限内留下最多六天的文件,这可以满足您的需求。如果这真的很重要,您当然可以让处理月份边界的代码更加智能。

    只需每天在您的盒子上运行此脚本,它就会使用标准的ftp 工具清除目标盒子上的文件。我仍然认为在服务器上运行find 会更容易,但如果该途径不可用,我会提供此选项。

    【讨论】:

    • @paxdiablo 您指定的命令用于删除本地计算机中的文件,而我需要使用 ftp 在远程计算机上删除它们..
    • 通过 ftp、del 或 mdel 没有办法做到这一点。如果文件名中有日期,您可以通过对特定文件进行 mdel'ing 来实现,否则您将不得不求助于某种“站点执行”技巧。但是我会担心如果你被允许这样做,因为它不是很安全。你为什么不在为你做的目标机器上每晚运行一个 cron 作业(使用我提供的命令)?这似乎是一个更简单的解决方案。
    • 嗯,这似乎是一个很好的解决方案,我将使用它..非常感谢 paxdiablo !!!
    • 文件名确实包含日期 是文件名格式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2012-06-27
    • 1970-01-01
    • 2011-02-21
    • 2012-11-09
    • 1970-01-01
    相关资源
    最近更新 更多