写作目的
初次使用shell来实现小功能,其间略显磕绊,故进行记录,作为后续使用的代码速查。
需求
需要将符合特定业务条件的大量图片copy到本地,同时将文件拆分到不同的子文件夹(利于分工),用于对图片进行人工筛选,形成测试集。
实现思路
将数据库中符合条件的图片导出为txt文件,然后用shell读取txt,实现图片集拷贝拆分。(优势:灵活、无需部署、随时调整)
源代码
#!/bin/bash
filepathlist=/opt/filelist.txt
destdir=/opt/d
cursubdir=0
percount=400
curcount=0
cursubcount=0
misscount=0
successcount=0
if [ ! -d "$destdir" ]; then
mkdir -p "$destdir"
fi
while read line
do
curcount=$[ curcount+1 ]
cursubcount=$[ cursubcount+1 ]
echo $line
array=(${line//,/ })
filepath=${array[2]}
echo $filepath
if [ ! -f "$filepath" ] ; then
echo "$filepath miss!"
misscount=$[ misscount+1 ]
continue
fi
if [ $cursubcount -eq 1 ];then
cursubdir=$[ cursubdir+1 ]
fi
if [ $[ curcount%percount ] -eq 0 ];then
cursubcount=0
fi
if [ ! -d "$destdir/$cursubdir" ]; then
mkdir "$destdir/$cursubdir"
fi
nfname="${array[0]}-${array[1]}-${filepath##*/}"
echo $nfname
cp $filepath $destdir/$cursubdir/$nfname
echo "copy $filepath to $destdir/$cursubdir/$nfname success ! "
successcount=$[ successcount+1 ]
done < $filepathlist
echo "$curcount files need copy,$successcount successed,$misscount missed!"
运行
sh 文件名.sh
遇到的问题和处理方式
- windows下写好的脚本上传到linux服务器后编译通不过。
原因:windows的换行符与linux下的不一致。
处理方式:在windows下用文本编辑器(如notepad++)将文件转换为unix格式。 - 文件上传下载,上传命令:rz,下载命令:sz 文件名
- 打包解包压缩解压
打包:tar -cvf 1.tar dir1
解包:tar -xvf 1.tar
压缩与解压:在打包和解包命令的option(-xvf)中加入z即可 - 文件编辑
(1)vi 文件名 (2)输入i进入编辑模式(3)编辑文档(4)Esc结束编辑(5)输入:wq回车保存并退出(:q!--退出不保存) - vi进行文件编辑时异常退出导致,每次重新编辑时提示,被提示文件被占用。
处理方式:把生成的临时文件.文件名.swp文件删除即可。(注:用ls -A可以查到swp文件) - 用
sh 文件名.sh
执行成功,用./文件名.sh
执行提示-bash: ./文件名.sh: Permission denied。
处理方式:授予文件可执行权限,命令如下:chmod +x 文件名.sh
- 使用
cat file|while read line do done
时,while循环中对变量的处理在done后面的脚本中无法体现。
原因:cat file|管道开了子shell,子shell无法访问主shell中的变量。
处理方式:修改为while read line do done < file
- 其他命令见:https://man.linuxde.net/