You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Bash脚本自动化删除PureFtpd FTP服务器中的文件夹?

如何通过Bash脚本自动化删除PureFtpd FTP服务器中的文件夹?

嘿,我来帮你搞定这个脚本的问题!你现在遇到的坑其实挺常见的——FTP原生的rmdir命令根本不支持-r参数,而且它只能删除完全空的文件夹,这就是你的脚本没按预期工作的原因。PureFtpd虽然好用,但受限于FTP协议本身的规则,原生命令没法直接递归删文件夹,不过有几个靠谱的解决办法:

方法一:用lftp工具(最省心的首选)

原生ftp命令功能太有限了,换用lftp就方便多了,它支持递归删除的rm -r命令,而且很多Linux发行版都能轻松安装。

首先确保你的系统装了lftp:

  • Debian/Ubuntu系:sudo apt install lftp
  • RHEL/CentOS系:sudo yum install lftp

然后把你的脚本改成这样:

#!/bin/sh

HOST=myhost.com
USER=my-user
PASSWORD=my-password

# 直接用lftp执行递归删除命令,完成后退出
lftp -e "rm -r /folder_A/assets; bye" -u $USER,$PASSWORD $HOST

这个命令会直接把/folder_A/assets整个文件夹(包括里面所有文件和子文件夹)一键删掉,完全不用手动处理层级问题,太省事了!

方法二:试试PureFtpd的站点级扩展命令

有些PureFtpd服务器管理员会开启站点级的递归删除权限,你可以试试把脚本里的rmdir -r assets换成下面的命令之一:

SITE RMDIR assets
# 或者有些服务器是 SITE RM -r assets

不过这个要看服务器的配置,如果管理员没开相关权限,这个命令会返回错误,所以可以先手动用FTP客户端试试这个命令能不能用,再写到脚本里。

方法三:用原生FTP命令手动递归清理(迫不得已才用)

如果你的系统没法装lftp,也没法用站点级命令,那只能手动先清光文件夹里的所有内容,再删除空文件夹。比如:

#!/bin/sh

HOST=myhost.com
USER=my-user
PASSWORD=my-password

ftp -inv $HOST <<EOF
user $USER $PASSWORD
cd /folder_A
# 先删除assets文件夹里的所有文件
mdelete assets/*
# 如果assets里有子文件夹,先删子文件夹里的文件,再删子文件夹
# 比如假设assets里有个subdir子文件夹
mdelete assets/subdir/*
rmdir assets/subdir
# 最后删除空的assets文件夹
rmdir assets
bye
EOF

不过这个方法有个大问题:如果文件夹里有多层子目录或者文件名带空格/特殊字符,处理起来会非常麻烦,所以除非万不得已,优先用前面两种方法。

看你贴的服务器反馈,脚本已经成功进入了/folder_A目录,只要把rmdir -r assets换成上面合适的命令,就能正常删除文件夹了。

备注:内容来源于stack exchange,提问作者Julien CORON

火山引擎 最新活动