如何在FTP中检查文件是否存在?Shell脚本报错求助
修复FTP操作Shell脚本的无效命令错误
原脚本的核心问题是把Shell的if条件判断直接写到了FTP会话的Here Document中,而FTP命令行环境无法识别Shell语法,这才触发了无效命令错误。下面是修正后的完整脚本,同时实现了文件存在判断、删除及上传逻辑:
修正后的脚本
#!/bin/sh LOCALPATH="/var/opt/list" DATE=$(date +'%Y%m%d%H') HOST="10.123.456.18" USER="admin" PSWD="admin" DIR="/var/opt/check" DIR2="/var/opt/final" # 临时文件存储FTP服务器上的文件列表 TEMP_FILE=$(mktemp) # 第一步:获取FTP服务器$DIR目录下的文件列表到临时文件 ftp -in $HOST <<EOF > $TEMP_FILE quote USER $USER quote PASS $PSWD cd $DIR ls quit EOF # 第二步:遍历本地$LOCALPATH下的SME*文件 cd "$LOCALPATH" for local_file in SME*; do # 检查文件是否存在(避免通配符匹配不到文件时的问题) if [ -f "$local_file" ]; then # 检查当前文件是否在FTP服务器的$DIR目录中 if grep -q "^$local_file" "$TEMP_FILE"; then # 标记需要删除的文件 delete_cmds="$delete_cmds rm $local_file" fi # 标记需要上传的文件 upload_cmds="$upload_cmds put $local_file $DIR2/$local_file" fi done # 第三步:执行FTP删除(如果有)和上传操作 if [ -n "$delete_cmds" ] || [ -n "$upload_cmds" ]; then ftp -in $HOST <<EOF quote USER $USER quote PASS $PSWD cd $DIR $delete_cmds cd $DIR2 $upload_cmds quit EOF fi # 清理临时文件 rm -f "$TEMP_FILE"
关键修正点说明
- 分离Shell逻辑与FTP会话:先通过FTP获取服务器文件列表到本地临时文件,再用Shell的
grep和循环判断文件是否存在,避免在FTP会话中使用Shell语法。 - 处理通配符边界情况:添加
[ -f "$local_file" ]判断,防止本地没有匹配到SME*文件时出现错误。 - 分阶段执行FTP命令:先收集需要删除和上传的命令,再一次性执行FTP会话,减少连接次数。
- 使用
mktemp创建临时文件:避免硬编码临时文件名,提升脚本安全性。
内容的提问来源于stack exchange,提问作者Jiggen
相关产品推荐
相关产品推荐

