我正在编写一个脚本来创建基本上是某些表的副本的文件,并将这些文件ftp到远程机器。还有一个要求是在转储这些文件之前删除远程机器上的3天旧文件。
我需要帮助编写ksh,以便使用ftp
删除远程计算机上的3天旧文件答案 0 :(得分: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可以询问另一个问题。
如果您的日期中包含特定的文件格式(正如您在评论中指明的那样),那么可以实际使用mdel
下的ftp
。请考虑以下脚本:
# 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
更容易,但如果该途径不可用,我将提供此选项。