免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7689 | 回复: 16
打印 上一主题 下一主题

请教windows下Perl移动文件并改名 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-02 14:07 |只看该作者 |倒序浏览
现要将上千个文件夹(下面有的包含子文件夹)下的图片文件由jpg改为gif格式, 但找到的程序输出文件要么送到同一个文件夹下,要么得一个一个定义, 太麻烦.
拟采取下面的方法解决, 用Perl将各文件夹下的文件都移到一个文件夹中, 移动后的文件名包含所在文件夹的信息, 等格式修改完成后再按文件名移回到原目录, 并去除文件夹信息(即还原为原文件名, 当然扩展名一定是新的gif的)
如:
将c:\目录1\目录11\20080808.jpg   移到  c:\目录0\目录1_目录11_20080808.jpg    处理后移回  c:\目录1\目录11\20080808.gif  
将c:\目录2\目录21\20080809.jpg   移到  c:\目录0\目录2_目录21_20080809.jpg    处理后移回  c:\目录2\目录21\20080809.gif
将c:\目录3\20080810.jpg              移到  c:\目录0\目录3_20080810.jpg                处理后移回  c:\目录3\20080810.gif
请各位大侠帮忙呵, 文件夹和文件太多了, 手动做不起呵
谢谢! 谢谢!

论坛徽章:
0
2 [报告]
发表于 2008-09-02 15:56 |只看该作者
何必这么麻烦,直接用程序重命名不就行了

论坛徽章:
0
3 [报告]
发表于 2008-09-02 19:00 |只看该作者
正好,我这里有个移动文件的小脚本,你看看能不能帮上忙

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;
use File::Copy;

my @dir = qw(c:/Xunlei/111);

File::Find::find(\&wanted, @dir);

sub wanted {
        if (/((pdf)|(chm))$/) {
                File::Copy::move($File::Find::name, 'c:/xunlei/111') unless -d;       
        }
}
yangfengwait 该用户已被删除
4 [报告]
发表于 2008-09-03 09:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2008-09-03 09:26 |只看该作者

回复 #4 yangfengwait 的帖子

已经很明显了

论坛徽章:
0
6 [报告]
发表于 2008-09-03 09:38 |只看该作者

回复 #3 cobrawgl 的帖子

谢谢cobrawgl
有两个问题, 一是如果在目录下存在图片文件和子目录, 则图片文件不能被移走, 处理后的情况如下, 其中的gif文件没被移走.

└─友好
    ├─031629000010.gif
    ├─031629000009.gif
    ├─031629000008.gif
    │  ├─08-06-007-Z-D001友好大楼照片
    │  └─08-06-007-Z-D001友好大楼房证土地证
    │      └─友好转让
    ├─031627000015.gif
    ├─031627000014.gif
    ├─031627000011.gif
    ├─031627000010.gif
    └─031627000009.gif

二是移走的文件没有带上路径标识, 因为要将jpg等格式的文件处理成800X600再转为gif格式后再移回去, 没有路径标识就无法移回去.
这两点Perl可以实现吗?  (刚接触, 实在无从下手, 活又急, 还请多帮助)

论坛徽章:
0
7 [报告]
发表于 2008-09-03 09:50 |只看该作者
可以啊,只是。。。上午有事情。。。

论坛徽章:
0
8 [报告]
发表于 2008-09-03 10:00 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2008-09-03 12:32 |只看该作者

回复 #8 story55 的帖子

"已经很明显了"什么意思呵, 给个语句呵

论坛徽章:
0
10 [报告]
发表于 2008-09-03 13:24 |只看该作者
这个小脚本应该能做到 移出,但是还没满足你在6楼说的那个第一个要求
移入那个反过来作应该可以吧

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;
use File::Copy;
use File::Basename;
use File::Spec;

my @dir = qw(c:/目录1 c:/目录2 c:/目录3);

File::Find::find(\&wanted, @dir);

sub wanted {
        my ($filename, $dir) = File::Basename::fileparse($File::Find::name);
       
        $dir =~ s{.*?/(.*?)/(.*?)/}{$1_$2_};
        $filename = File::Spec->catfile('d:/tt', $dir.$filename);
       
        File::Copy::move($File::Find::name, $filename);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP