最近需要在windows和服务器linux系统之间传递大量的文件,部分文件非常大(TB以上),并且文件夹中包含文件或文件夹,需要先进行上传再进行组织,因此就想办法结合curl和wget命令编写了命令或脚本工具,供大家参考学习。本文主要实现了单文件上传下载,多文件/嵌套文件夹上传下载,如果需要续传,记得加上-C参数。
1.指定单个文件下载
curl -u 用户名:密码 -O http://域名/video/output-20241010_110705.mp4
wget --user=用户名 --password=密码 http://域名/video/output-20241010_110705.mp4
2.指定文件列表下载
下载文件列表存放在urls.txt中。下载脚本(downloadBatchGet.sh和downloadBatchCurl.sh)如下,命令行输入参数为urls.txt。
# wget命令 downloadBatchGet.sh
# 命令行运行方式:./downloadBatchGet.sh urls.txt
wget --user=用户名 --password=密码 -i $1
# curl命令 downloadBatchCurl.sh
# 命令行运行方式:./downloadBatchCurl.sh urls.txt
while read url; do
echo $url
curl -u 用户名:密码 -O $url
done < $1
# urls.txt文件内容
http://域名/video/info.db
http://域名/video/output-20241010_110705.mp4
3.客户端上传单个文件
curl -u 用户名:密码 -T model-1-of-00002.safetensors http://域名/video/
4.客户端上传指定文件夹及子文件夹的所有文件
目前不支持自动创建文件夹,只能通过递归获取文件并完成所有文件上传,或者指定目录的所有文件上传,详见以下两个脚步。
1)指定目录下所有文件上传脚本:./uploadBatch.sh /mnt/e/temp2
#!/bin/bash
#上传URL
URL="http://域名/video/"
#上传文件夹路径
#FOLDER="/mnt/e/temp2"
for FILE in "$1"/*; do
echo "Processing $FILE"
# 在这里添加你需要对每个文件执行的命令
#构造curl命令,将文件上传至服务器
curl -u 用户名:密码 -T "$FILE" $URL
done
2)指定目录及其子目录及以下的所有文件上传脚本:./uploadBatchTraverse.sh /mnt/e/temp2
#!/bin/bash
#上传URL
URL="http://域名/video/"
#上传文件夹路径
FOLDER="/mnt/e/temp2"
traverse_dir(){
for file in $1/* #这里的$1是通过递归调用传入。
do
if [ -d $file ]
then
#echo $file
traverse_dir $file
elif [ -f $file ]
then
echo $file
#构造curl命令,将文件上传至服务器
curl -u 用户名:密码 -T "$file" $URL
fi
done
}
#traverse_dir "$FOLDER"
traverse_dir $1 #这里的$1是通过bash命令行传入。
5、常见问题解决方案与注意事项
1)bash for 未预期的符号 `$‘do\r‘‘ 附近有语法错误
解决方法:vim uploadbatch.sh,在保存模式下输入:set ff=unix即可。
注意:urls.txt文件保存时,也需要采用这种方式来保存一下。
2)其他注意事项
文件夹中的文件名长度不能太长,否则会无法上传成功。