水逆的一天写代码,其实已经是两个礼拜前的shell实战任务了,但是由于我一直拖一直拖,直到今天下午才写完,在这里感谢我的组长 ,他的代码实在是太怪了(着实是想不到)
首先,这个实战的要求如下:
1.这堆图片的文件名是不连续的数字
2.将这堆图片的文件名变连续
3.不能改变图片原来的顺序
例如:
为了不改变图片的顺序,将排序完的图片储存到另一个文件夹中
第一版:
#!/bin/bash
cd /home/computer/shell/practice/demo
a=1
for file in $(ls)
do
name=${file%.*}
NUM[a]=$name
((a=a+1))
echo "$name"
done
for (( i=1; i < a; i++));do
ischanged=false
for ((j=a-1; j> i; j--));do
if [ ${NUM[j]} -lt ${NUM[j-1]} ];then
temp=${NUM[j]}
NUM[j]=${NUM[j-1]}
NUM[j-1]=$temp
ischanged=true
fi
done
if [ ischanged = "false" ] ;then
break;
fi
done
#for((i=1;i<a;i++));
#do
# echo "${NUM[$i]}"
#done
for file in $(ls)
do
mingzi=${file%.*}
for((x=1;x<a;x++));
do
if [ $mingzi == ${NUM[$x]} ]
then
new=`printf "%05d\n" $x`
cp $file /home/computer/shell/practice/demo_new/$new.jpg
fi
done
done
可能是C语言学多了,第一反应是写一个排序,将收集到的文件名字排个序再输出,所以写了一个冒泡排序。但是缺点很明显,首先代码很多,就很烦;还有就是这个排序的时间很长,万一有很多图片,就会很慢。然后组长就说不用排序(这个是实在想不出来)
第二版:
#!/bin/bash
cd /home/computer/shell/practice/demo
a=1
for file in $(ls | sort -n)
do
name=${file%.*}
echo "$name"
new=`printf "%05d\n" $a`
cp $file /home/computer/shell/practice/demo_new/$new.jpg
((a=a+1))
done
效果如下
想了很久,查资料的时候发现sort可以排序,甚至可以数字排序,于是就有了想法。写完了,组长说还不错,于是完结撒花。
组长的代码:
#!/bin/bash
cnt=0
for((i=0;i<20000;i++))
do
if test -e JPEGImages/$i.jpg
then
((cnt++))
cp JPEGImages/$i.jpg jpeg_successed/$cnt.jpg
else
echo "file $i.jpg does not existed"
fi
done
因为实在是好奇什么样的情况下可以不排序,所以要来了组长的代码,组长不愧是组长,不到13行就写完了,甚至还给输了个提示。但也是有一点缺点的,万一只有两张图片,一张叫1.jpg,一张叫10000.jpg,那就需要很久了。
实战是用来学知识的,这次也不例外
1.shell之sort
shell sort是对插入排序的扩展,但是比插入排序速度快很多。
选项 | 说明 |
---|---|
-b | 忽略每行前面的空白区域 |
-d | 只考虑处理空格和字母字符,数字 |
-f | 忽略字母大小写 |
-m | 合并已经排序的文件,不排序 |
-n | 根据字符串的数字比较 |
-o | 将排序后的结果写入文件 |
-r | 以相反的顺序来排序(sort默认排序是从上往下是从小到大,加使用-n选项可以翻转排序) |
-t | 指定排序时所用的分隔字符 |
-k | 指定需要排序的栏位(列,域) |
-u | 忽略相同行 |
这次实战用到了其中的-n,举例:
2.shell之获取文件名和后缀
不带目录的文件名
#代码:
file=”thisfile.txt”
echo “filename: ${file%.*}”
echo “extension: ${file##*.}”
#输出:
filename: thisfile
extension: txt
带目录的文件名
var=/dir1/dir2/file.txt
echo ${var##*/}
file.txt
#提取后缀
echo ${var##*.}
txt
#提取不带后缀的文件名,分两步
tmp=${var##*/}
echo $tmp
file.txt
echo ${tmp%.*}
file
#提取目录
echo ${var%/*}
/dir1/dir2
3.shell之test
组长的代码中有一个test -e,但是我没学过这个命令,于是查询。
选项 | 说明 |
---|---|
-e | 该【档名是否存在】(常用) |
-f | 该【档名】是否存在且为文件(file)(常用) |
-d | 该【文件名】是否存在且为目录(directory)(常用) |
-b | 该【档名】是否存在且为一个block device装置 |
-c | 该【档名】是否存在且为一个character device装置 |
-S | 该【档名】是否存在且为一个Socket文件 |
-p | 该【档名】是否存在且为一个FIFO(pipe)文件 |
-L | 该【档名】是否存在且为一个连结档 |
4.shell之`符号
``内部通常是一个shell命令,在执行脚本之前,会先执行这个命令,相当于函数调用