分页: 1 / 2

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

发表于 : 2008-08-17 21:26
tony3322
在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窗口,这样更方便。

发表于 : 2008-08-17 21:29
eexpress
lin下的改名,都支持正则的。标准的用rename。其他如rox thunar gqview等批量改名试试。

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

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

发表于 : 2008-08-17 21:49
tony3322
改进版:(无覆盖文件危险)

代码: 全选

#!/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

发表于 : 2008-08-17 21:50
nicety
下载下来收藏,学习。

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

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

代码: 全选

ls -l | awk '/^[a-z\-]/{print $5"@"$NF}' | sort -g | sed 's/^.*@//'/

发表于 : 2008-08-17 21:53
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....

发表于 : 2008-08-17 21:56
xiooli
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还可以这样用?孤陋寡闻了。

发表于 : 2008-08-17 21:59
xeoc
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....
怎么保留扩展名呢?

发表于 : 2008-08-17 22:03
xeoc
最好有个什么软件可以....

发表于 : 2008-08-17 22:04
eexpress
没注意过这个。需要按照大小或者时间改吗?那就要用脚本了。
照片按照exif信息改名的,包括时间/尺寸的,记得是有的,在源里面搜索描述包含exif的一堆。可我没这需要。thunar支持某些exif和id3的改名。

发表于 : 2008-08-17 22:10
pjincz
回9楼哈,如果想改指定扩展名的文件 比如说*.png 那么就接在ls后面

发表于 : 2008-08-17 22:12
pjincz
否则的话就用正则表达式了

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

shell+awk+sed 正在学...

发表于 : 2008-08-17 22:21
pjincz
shell命令可定制性很大的 说说你的要求 我给你改改