您的位置:首页 > 运维架构 > 网站架构

多级目录批量下载网站图片修订版,及改名方法

2012-03-03 12:30 357 查看
3.10再次修改。经过多次测试发现mv方式不是很好用,不再采用mv方式,而是进入目录后再进行下载,此次测试达到了预期效果
修改后的版本为

#!/bin/bash
#下载
#author:falconhero
#qq:40594324
PATH=$PATH:$HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/usr/sbin:/usr/bin:/root/bin
export PATH
mkdir -p /root/201010/{1..100}

for j in {1.100}
do
for i in {1..50}
do
cd /root/201010/$j
wget http://wvw.123456.com/201010/$j/$i.jpg &

done
done

由于没注意导致重复下载了一次。后缀名变成了.jpg.1,原来的下载图片有的只下了一半,所以删除第一次下载的,保留第2次的

find . -name \*.jpg |xargs rm -f

重命名方法:

#!/bin/bash
for i in {10..78}
do
cd /root/201011/$i

rename ".jpg.1" ".jpg" *
done

可以再虚拟机里面下载,下载完毕后,用ftp的模式导出。
常用crt软件xshell自带ftp,用起来不错,比secureCRT好用。不用再打包下载了。
虚拟机内存视下载量调整,512M死掉概率很高,测试时候使用1G内存,下载进程1600+,再用top模式查看时发现内存使用瞬间降到0.然后逐渐恢复正常。如果在windows同时开启1000+下载进程估计会直接导致系统死机,windows下未尝试
大概1G内存支持到1600左右的下载进程,没有太细究。
IP地址为随意写的。请自行修改为你要下载的地址。
-----------------------------------------------
#暂告一段落:由于双变量混合数字会导致$m0$l 变为一个数字,所以转义0,写为20$m\0$l,测试成功,因测试20$m\0$l目录全为空,删除
实地测试:循环变量不能多嵌套,有几个变量就用几个变量,否则会额外循环N次
执行方法chmod 755 wgetdown.sh ;nohup ./wgetdown.sh & ,后台自动执行

#!/bin/bash
#下载
#author:falconhero
#qq:40594324
PATH=$PATH:$HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/usr/sbin:/usr/bin:/root/bin
export PATH
mkdir -p 20{10..12}{10..12}/{1..100}
mkdir -p 20{10..12}0{1..9}/{1..100}

for m in {10..12}
do
for j in {1..65}
do
for i in {1..50}
do
wget http://wvw.123456.com/2010$m/$j/$i.jpg mv *.jpg 20$m$m/$j/
done
done
done

#删除空目录下的空目录
for n in `find /root/falcon -type d -empty`;
do rmdir $n;
done
#删除空目录
for n in `find /root/falcon -type d -empty`;
do rmdir $n;
done

------------------额外测试--------------------
一些测试
wget http://wvw.Domain Name.com/2010$k/$j/$i.jpg &
#后台全部执行,但是命名会混乱,舍弃(再次测试,发现不会导致命名混乱)
修订:不会造成命名混乱,但是会导致消耗光大量内存。。毕竟相当于无限进程下载。。也就是linux稳定性不错,windows要是开启1000进程下载,早崩溃了。。。

关闭当前窗口后,下载终止解决方法
chmod 755 wgetlist
nohup ./wgetlist &
完美解决。后台慢慢下载去了

原因探索:

上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出

测试时额外多写了一层循环变量,但调用时候并未使用变量,导致多循环了数次
删除额外变量后,达到预期循环目的
结论:循环语句不能多写无用变量,会严重影响效率,重复执行N遍代码

--------------------搜集资料------------------

后面为转载,注释 http://hankjin.blog.163.com/blog/static/337319372010111492348473/

1. 使用&符号在后台执行命令

你可以在Linux命令或者脚本后面增加&符号,从而使命令或脚本在后台执行,例如:.
$ ./my-shell-script.sh &
详情请参考这篇文章 Bg, Fg, &, Ctrl-Z – 5 Examples to Manage Unix Background Jobs

2. 使用nohup在后台执行命令

使用&符号在后台执行命令或脚本后,如果你退出登录,这个命令就会被自动终止掉。要避免这种情况,你可以使用nohup命令,如下所示:
$ nohup ./my-shell-script.sh &
详情请参考这篇文章 Unix Nohup: Run a Command or Shell-Script Even after You Logout

3. 使用screen执行命令

通过nohup和&符号在后台执行命令后,即使你退出登录,这个命令也会一直执行。但是,你无法重新连接到这个会话,要想重新连接到这个会话,你可以使用screen命令。. Linux的screen命令提供了分离和重新连接一个会话的功能。当你重新连接这个会话的时候,你的终端和你分离的时候一模一样。 详情请参考这篇文章 Screen Command Examples: Get Control of Linux / Unix Terminal

4. 使用at将一个命令作为批处理执行

使用at命令,你可以让一个命令在指定的日期和时间运行,例如要在明天上午10点在后台执行备份脚本,执行下面的命令:
$ at -f backup.sh 10 am tomorrow
详情请参考这篇文章 Understand at, atq, atrm, batch Commands using 9 Examples
在批处理模式下执行某些任务需要启用一些选项。下面的文章会给出详细解释:. How To Capture Unix Top Command Output to a File in Readable Format
Unix bc Command Line Calculator in Batch Mode
How To Execute SSH and SCP in Batch Mode (Only when Passwordless login is enabled)

5. 使用watch连续地执行一个命令

要想按一个固定的间隔不停地执行一个命令,可以使用watch命令,如下所示:
$ watch df -h
详情请参考这篇文章 Watch: Repeat Unix Commands or Shell-Scripts every N seconds

============================================
4.26后续
现在跟oldboy老师上完编程课了,哪天继续修改下脚本去。重新测试完善下经验
本文出自 “无悔” 博客,请务必保留此出处http://falconhero.blog.51cto.com/3369040/795078
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: