如何通过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




