【发布时间】:2011-01-10 07:29:51
【问题描述】:
我正在编写一个脚本来创建基本上是某些表的副本的文件,并将这些文件通过 ftp 传输到远程计算机。在转储这些文件之前,还需要删除远程计算机上 3 天的旧文件。
我需要帮助编写 ksh 以使用 ftp 在远程计算机上删除 3 天前的文件
【问题讨论】:
我正在编写一个脚本来创建基本上是某些表的副本的文件,并将这些文件通过 ftp 传输到远程计算机。在转储这些文件之前,还需要删除远程计算机上 3 天的旧文件。
我需要帮助编写 ksh 以使用 ftp 在远程计算机上删除 3 天前的文件
【问题讨论】:
通常,您会使用:
find . -mtime +3 -exec rm {} ';'
或类似的东西(即,可能有其他限制条款,如-type f 用于常规文件或-maxdepth 0 仅用于当前目录,没有子目录)。 -mtime +3 只获取那些修改日期为 3 天或更长时间的文件。
在您的系统上执行man find 以获取完整详细信息。我不知道 Solaris 是否具有与 GNU 相同的功能。它可能更有限(或更好)。
更新:请以你崇拜的任何神灵的名义,先用echo而不是rm测试命令。如果您相信“网络上某个随机的家伙可能会或可能不会将您的最大利益放在心上”的建议,我对破坏您的文件不承担任何责任:-)
而且,在有人插手指责我没有使用xargs(或者,更好的是,find -print0 和xargs -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 会更容易,但如果该途径不可用,我会提供此选项。
【讨论】: