求解决ubuntu server 下200万图片的,重命名问题
- 青蜂侠6
- 帖子: 15
- 注册时间: 2012-05-10 15:30
- 联系:
求解决ubuntu server 下200万图片的,重命名问题
首先是这样的,200多万图片被放在2000多个文件夹中,自动生成24位条码,后缀分别是_-1, _0, _1, _2, _3,每个条码可能最多分别拥有这些后缀。
举例,*代表条码,那么*条码下最多拥有 *_-1.PNG,*_0.PNG,*_1.PNG,*_2.PNG,*_3.PNG ,并且相同条码都会在一个文件夹下。
那么现在需要做的是,仅把拥有_-1的条码后缀+1(大部分条码是没有_-1后缀的,而是直接从_0开始的),也就是改成,*_0.PNG,*_1.PNG,*_2.PNG,*_3.PNG ,*_4.PNG
而且按图片原来后缀的顺序,一定不能变。
实在是棘手,束手无策中。。。。
举例,*代表条码,那么*条码下最多拥有 *_-1.PNG,*_0.PNG,*_1.PNG,*_2.PNG,*_3.PNG ,并且相同条码都会在一个文件夹下。
那么现在需要做的是,仅把拥有_-1的条码后缀+1(大部分条码是没有_-1后缀的,而是直接从_0开始的),也就是改成,*_0.PNG,*_1.PNG,*_2.PNG,*_3.PNG ,*_4.PNG
而且按图片原来后缀的顺序,一定不能变。
实在是棘手,束手无策中。。。。
新手签名要低调,恩恩。
- 青蜂侠6
- 帖子: 15
- 注册时间: 2012-05-10 15:30
- 联系:
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 求解决ubuntu server 下200万图片的,重命名问题
代码: 全选
find . -name '*_-1.png' -o -name '*_-1.PNG' | xargs perl-rename 's/-1\.(png|PNG)$/+1.png/'
顺便把文件后缀统一成小写了……
- 青蜂侠6
- 帖子: 15
- 注册时间: 2012-05-10 15:30
- 联系:
Re: 求解决ubuntu server 下200万图片的,重命名问题
再请问一下,怎么从这些图片中查找出,一些没有扩展名的文件?lilydjwg 写了:perl-rename 程序在你的系统上也可能是 rename.pl 等,请自行辨别。代码: 全选
find . -name '*_-1.png' -o -name '*_-1.PNG' | xargs perl-rename 's/-1\.(png|PNG)$/+1.png/'
顺便把文件后缀统一成小写了……
新手签名要低调,恩恩。
- 青蜂侠6
- 帖子: 15
- 注册时间: 2012-05-10 15:30
- 联系:
Re: 求解决ubuntu server 下200万图片的,重命名问题
perl-rename 's这个意思是?lilydjwg 写了:perl-rename 程序在你的系统上也可能是 rename.pl 等,请自行辨别。代码: 全选
find . -name '*_-1.png' -o -name '*_-1.PNG' | xargs perl-rename 's/-1\.(png|PNG)$/+1.png/'
顺便把文件后缀统一成小写了……

新手签名要低调,恩恩。
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
Re: 求解决ubuntu server 下200万图片的,重命名问题
直接是rename,不要管perl-rename或者rename.pl。
man perlre
学会正则。
其他不求人。
就是后缀+1嘛。还是只处理_-1的,变成0?描述不是很清楚。
man perlre
学会正则。
其他不求人。
就是后缀+1嘛。还是只处理_-1的,变成0?描述不是很清楚。
● 鸣学
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 求解决ubuntu server 下200万图片的,重命名问题
util-linux 里也有个 rename 程序的。eexpress 写了:直接是rename,不要管perl-rename或者rename.pl。
man perlre
学会正则。
其他不求人。
就是后缀+1嘛。还是只处理_-1的,变成0?描述不是很清楚。
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 求解决ubuntu server 下200万图片的,重命名问题
对有扩展名的取反不就可以了?青蜂侠6 写了: 再请问一下,怎么从这些图片中查找出,一些没有扩展名的文件?
代码: 全选
find . ! -name '*.*'
- 青蜂侠6
- 帖子: 15
- 注册时间: 2012-05-10 15:30
- 联系:
Re: 求解决ubuntu server 下200万图片的,重命名问题
是带有_-1后缀的条码,这个条码的后缀全部+1eexpress 写了:直接是rename,不要管perl-rename或者rename.pl。
man perlre
学会正则。
其他不求人。
就是后缀+1嘛。还是只处理_-1的,变成0?描述不是很清楚。
新手签名要低调,恩恩。
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
Re: 求解决ubuntu server 下200万图片的,重命名问题
那不就是-1变成0?
s/_-1\./_0./
就可以了。
如果是全部+1,就写成
s/_([-\d]*)\./"_".($1+1)."."/e
s/_-1\./_0./
就可以了。
如果是全部+1,就写成
s/_([-\d]*)\./"_".($1+1)."."/e
● 鸣学
-
- 帖子: 992
- 注册时间: 2007-12-05 10:57
- 系统: ubuntu14.04
- 来自: 金山
Re: 求解决ubuntu server 下200万图片的,重命名问题
将文件a1x 改名为 a2y
问下eexpress
" ".($1+1)." "
括号要在双重双引号之内,而且要在旁边加两个.
如何理解这个语法?
代码: 全选
s/(\d)x/"".($1+1)."y"/e a1x
" ".($1+1)." "
括号要在双重双引号之内,而且要在旁边加两个.
如何理解这个语法?
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
Re: 求解决ubuntu server 下200万图片的,重命名问题
e是表示:替换部分,使用函数功能。
.是连接字符串而已。
()是取函数结果。
就是替换部分,是纯perl语法。搜索部分,是正则语法。
.是连接字符串而已。
()是取函数结果。
就是替换部分,是纯perl语法。搜索部分,是正则语法。
● 鸣学
- wjchen
- 帖子: 583
- 注册时间: 2011-05-02 19:08
- 系统: ubuntu 12.04
Re: 求解决ubuntu server 下200万图片的,重命名问题
楼主的意思应该不仅仅是-1变成0,而是相应条码的-1变成0、0变成1、1变成2……
楼上的都不完全对。
我的思路
有点麻烦,期待高人写出更好方法。
楼上的都不完全对。
我的思路
代码: 全选
find . -name '*_-1.png' -o -name '*_-1.PNG' | while read p;do
temp=`basename "$p"`
find . -name "${temp%_*}_*" | xargs rename 's/_([-\d]*)\./"_".($1+1)."."/e'
done
上次由 wjchen 在 2012-05-24 9:02,总共编辑 1 次。
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 求解决ubuntu server 下200万图片的,重命名问题
你在命令行里输入wjchen 写了:楼主的意思应该不仅仅是-1变成0,而是相应条码的-1变成0、0变成1、1变成2……
楼上的都不完全对。
代码: 全选
$ echo my password




















-
- 帖子: 151
- 注册时间: 2009-05-29 22:05
Re: 求解决ubuntu server 下200万图片的,重命名问题
那两千多个目录中,只要有-1的,就把那目录png加一?是这么个意思?
代码: 全选
#!perl -w
use strict;
#ni de 2000duoge wenjianjia shi zai tong yi mulu?
my @files_subdir;
my $old;
for my $dir (grep{ -d}glob"*"){
@files_subdir=grep{-f}glob"$dir/*";
if(grep{/-1(?=\.png$)/i}@files_subdir){
for(@files_subdir){
$old=$_;
s/(?<=_)([-]?\d)(?=\.png$)/$1+1/ie;
rename $old,$_;
}
}
else{
next;
}
}