[原创]文件批量重命名脚本

sh/bash/dash/ksh/zsh等Shell脚本
头像
tony3322
帖子: 38
注册时间: 2007-08-17 17:10
送出感谢: 0
接收感谢: 0
联系:

[原创]文件批量重命名脚本

#1

帖子 tony3322 » 2008-08-17 21:26

在xp下选中多个文件---右键----重命名---回车
会产生相同前缀排序的文件。

我想再ubuntu下实现这个效果。
于是搜索了一番,没搜到令我满意的。

请教了一下群里的朋友。他给我写了几句,确实可以达到以上目的:

代码: 全选

let i=0;for it in *.png;{ mv "$it" "photo${i}.png"; let i=i+1; } 
但是这个脚本用于不同类型文件,想要改前缀,都得打开修改脚本。而且必须放在文件同目录里。

这个脚本是一个主干,我研究了一下脚本的基础知识之后,经过多次修改测试,终于被我写出了满意的脚本。

代码: 全选

#!/bin/bash
#用法:在终端使用"./renames.sh"运行
echo "===本脚本实现批量重命名某种类型文件为相同前缀+数字的文件===";
echo "!警告:一定要确保输入的前缀加上数字后,不和原先已有的文件名重复,否则文件会因为替换而丢失";
echo --------------------------------------------------------------------
echo "?---输入批量文件所在目录(如:/home/andy/图片)(当前目录输入 .即可)---";   
read  directory;
cd  "$directory";
echo "?---输入要重命名文件类型和前缀(如:png  img_  (区分大小写))[以空格分割]---";
read ext  begin;
echo ">>>开始批量重命名  $directory 下的 $ext 文件>>>>>>>>>>>>>>";
let  i=0;
             for it in   *.$ext; do
                   mv "$it"   "$begin$i.$ext";
                   let i=i+1; 
             done
echo "===完成$i个文件批量重命名,文件列表如下:";
ls  *.$ext
echo -----------------------------------------------------------------------
注释和提示显示都用中文,便于大家理解。你可以改掉或去掉。

把以上代码保存为renames.sh
放在任意目录,终端运行 ./renames.sh
输入提示1:输入要批量重命名的文件路径。(文件和脚本同目录或在子目录可省略些,如”.“、“./photo”)
输入提示2:文件类型、重命名前缀(不输入前缀则文件重命名为数字0、1、2、3……)
(你输入前缀abc,那么批量重命名后的文件就是abc0、abc1、abc2、abc3……。假如事先已存在abc1,你还要用abc做前缀,这个文件就可能被替换。所以你一定要用abc的话建议你先用xyz,然后再运行一次这个脚本。)

发现我写得太罗嗦了。

这是我的第一个shell脚本,大家支持一下啊。

也许高手有更简短的语句可以实现。但我对那些/^!#@$%*\还不是很理解,所以献丑了。

如有更好办法,不妨贴出来大家分享。
希望大家一起来改进这个脚本。最好哪位高手做个简单的GUI窗口,这样更方便。
附件
Linux批量重命名脚本.tar
Linux批量重命名脚本
(10 KiB) 下载 158 次
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#2

帖子 eexpress » 2008-08-17 21:29

lin下的改名,都支持正则的。标准的用rename。其他如rox thunar gqview等批量改名试试。
● 鸣学
xeoc
帖子: 1994
注册时间: 2007-05-06 10:12
送出感谢: 0
接收感谢: 0

#3

帖子 xeoc » 2008-08-17 21:41

eexpress 写了:lin下的改名,都支持正则的。标准的用rename。其他如rox thunar gqview等批量改名试试。
ee知道有什么可以按文件大小排序命名的么?

我试过的软件,排序命名按照的序列都不能按文件大小或者时间或者什么,都是按照文件名,如果调就得手动挑,郁闷死了
头像
tony3322
帖子: 38
注册时间: 2007-08-17 17:10
送出感谢: 0
接收感谢: 0
联系:

#4

帖子 tony3322 » 2008-08-17 21:49

改进版:(无覆盖文件危险)

代码: 全选

#!/bin/bash
echo "?---输入批量文件所在目录(如:/home/andy/图片)(当前目录输入 .即可)---";   
read  directory;
cd  "$directory";
echo "?---输入要重命名文件类型和前缀(如:png  img_  (区分大小写))[以空格分割]---";
read ext  begin;
mkdir  temp
echo ">>>开始批量重命名  $directory 下的 $ext 文件>>>>>>>>>>>>>>";
let  i=0;
             for it in   *.$ext; do
                   mv "$it"   ./temp/"$begin$i.$ext";
                   let i=i+1; 
             done
mv  ./temp/*.$ext   ./
rm -r  temp
echo "===完成$i个文件批量重命名,文件列表如下:";
ls  *.$ext
头像
nicety
帖子: 92
注册时间: 2008-07-14 15:06
来自: 天津
送出感谢: 0
接收感谢: 0
联系:

#5

帖子 nicety » 2008-08-17 21:50

下载下来收藏,学习。
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

#6

帖子 xiooli » 2008-08-17 21:50

xeoc 写了:
eexpress 写了:lin下的改名,都支持正则的。标准的用rename。其他如rox thunar gqview等批量改名试试。
ee知道有什么可以按文件大小排序命名的么?

我试过的软件,排序命名按照的序列都不能按文件大小或者时间或者什么,都是按照文件名,如果调就得手动挑,郁闷死了

代码: 全选

ls -l | awk '/^[a-z\-]/{print $5"@"$NF}' | sort -g | sed 's/^.*@//'/
头像
pjincz
帖子: 171
注册时间: 2007-02-07 10:15
送出感谢: 0
接收感谢: 9 次
联系:

#7

帖子 pjincz » 2008-08-17 21:53

楼上的问题其实很好解决哈。。
从小到大:
let i=0; for it in `ls -S -r`; { mv "$it" "size${i}.txt"; let i=i+1; }
从大到小:
let i=0; for it in `ls -S`; { mv "$it" "size${i}.txt"; let i=i+1; }
我上面的脚本是用来排序我的文件的哈,命名为size0.txt....
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

#8

帖子 xiooli » 2008-08-17 21:56

pjincz 写了:楼上的问题其实很好解决哈。。
从小到大:
let i=0; for it in `ls -S -r`; { mv "$it" "size${i}.txt"; let i=i+1; }
从大到小:
let i=0; for it in `ls -S`; { mv "$it" "size${i}.txt"; let i=i+1; }
我上面的脚本是用来排序我的文件的哈,命名为size0.txt....
:shock: ls还可以这样用?孤陋寡闻了。
xeoc
帖子: 1994
注册时间: 2007-05-06 10:12
送出感谢: 0
接收感谢: 0

#9

帖子 xeoc » 2008-08-17 21:59

pjincz 写了:楼上的问题其实很好解决哈。。
从小到大:
let i=0; for it in `ls -S -r`; { mv "$it" "size${i}.txt"; let i=i+1; }
从大到小:
let i=0; for it in `ls -S`; { mv "$it" "size${i}.txt"; let i=i+1; }
我上面的脚本是用来排序我的文件的哈,命名为size0.txt....
怎么保留扩展名呢?
xeoc
帖子: 1994
注册时间: 2007-05-06 10:12
送出感谢: 0
接收感谢: 0

#10

帖子 xeoc » 2008-08-17 22:03

最好有个什么软件可以....
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#11

帖子 eexpress » 2008-08-17 22:04

没注意过这个。需要按照大小或者时间改吗?那就要用脚本了。
照片按照exif信息改名的,包括时间/尺寸的,记得是有的,在源里面搜索描述包含exif的一堆。可我没这需要。thunar支持某些exif和id3的改名。
● 鸣学
头像
pjincz
帖子: 171
注册时间: 2007-02-07 10:15
送出感谢: 0
接收感谢: 9 次
联系:

#12

帖子 pjincz » 2008-08-17 22:10

回9楼哈,如果想改指定扩展名的文件 比如说*.png 那么就接在ls后面
头像
pjincz
帖子: 171
注册时间: 2007-02-07 10:15
送出感谢: 0
接收感谢: 9 次
联系:

#13

帖子 pjincz » 2008-08-17 22:12

否则的话就用正则表达式了
xeoc
帖子: 1994
注册时间: 2007-05-06 10:12
送出感谢: 0
接收感谢: 0

#14

帖子 xeoc » 2008-08-17 22:13

pjincz 写了:回9楼哈,如果想改指定扩展名的文件 比如说*.png 那么就接在ls后面
$ext行不?不一样的...

shell+awk+sed 正在学...
头像
pjincz
帖子: 171
注册时间: 2007-02-07 10:15
送出感谢: 0
接收感谢: 9 次
联系:

#15

帖子 pjincz » 2008-08-17 22:21

shell命令可定制性很大的 说说你的要求 我给你改改
回复

回到 “Shell脚本”