怎么利用shell批量把图片改名(数字排序)

水逆的一天写代码,其实已经是两个礼拜前的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,举例:
在这里插入图片描述

shell中sort命令详解

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该【档名】是否存在且为一个连结档

test指令(笔记)

4.shell之`符号
``内部通常是一个shell命令,在执行脚本之前,会先执行这个命令,相当于函数调用

shell语法之 , ‘ ‘ , {},``, ,‘‘,(),$(())四种语法含义

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值