更改文件名首字母

时间:2015-01-30 22:32:43

标签: bash perl

这个我需要做的事情,在这个时刻不能强迫我的大脑思考一个快速的方法,所以这是我的问题:

我收到了许多名为的文件,让我们说:

word1_word2.ext
word3_word4.ext
word5_word5.ext
..

我需要在osx中​​创建一个bash / perl / etc脚本来改变他们的文件名,基本上做3件事:

  • 将每个单词首字母大写
  • 删除_字符
  • 添加字符串' .full'在名称之后,在扩展名之前

所以,换句话说..

' whatever_whatever2_whatever3.jpg'无论是什么,无论是什么,无论是什么,三十五岁,才一致。

任何帮助都会受到欢迎:)

3 个答案:

答案 0 :(得分:2)

此Perl单行程序将按您的要求执行

perl -e 'rename($_, tr/_/ /r =~ s/(?<!\.)\b([a-z])/\u$1/gr =~ s/(?=[^.]+$)/full./r) for glob "*.ext"'

它使用tr///将所有下划线转换为空格,然后将s///转换为大写所有小写字母,前面是单词边界而不是点字符,并再次使用在后缀full.之前。它对/rtr使用非破坏性s修饰符,以便返回修改后的字符串,而不是就地编辑它。

答案 1 :(得分:1)

一个简单版本,它从命令行获取文件列表,根据您的示例重命名:

#!/usr/bin/perl

use strict;
use warnings;
use File::Copy qw(move);

for my $fn (@ARGV)
{
  my $newfn = $fn;

  # replace any spaces, tabs or _ with a single ' '  
  $newfn =~ s/[_ \t]+/ /g;     

  # uppercase the first letter of any words in the new string
  $newfn =~ s/(^|\s)([a-z])/$1\U$2/g;

  # and add '.full' before any extension
  $newfn =~ s/(\.[^\.]+)$/.full$1/g;

  # and rename
  move($fn, $newfn) or die "Unable to rename '$fn' to '$newfn': $!\n";
}

答案 2 :(得分:0)

假设你有一个基于Perl的rename命令(通常称为prename),那么:

$ prename -n 's/^./\U$&/; s/_(.)/\U$1/g ;s/\.[^.]+$/.full$&/' whatever_whatever2_whatever3.jpg 
whatever_whatever2_whatever3.jpg renamed as WhateverWhatever2Whatever3.full.jpg
$

第一个替代品用大写字母替换前导字母;第二个用_x取代X;第三个在后缀字符串之前插入.full(一个点后跟非点)。如果你想要空格而不是删除下划线,那么修复是微不足道的(使用s/_(.)/ \U$1/g作为第二个替代)。

在Ubuntu 14.04 LTS衍生产品上进行测试。