更改文件名首字母

Change filenames first letter

这是我需要做的一件有点具体的事情,在这个时候不能强迫我的大脑思考一个快速的方法来做这件事,所以这是我的问题:

我命名了很多文件,比方说:

word1_word2.ext
word3_word4.ext
word5_word5.ext
..

我需要在 osx 中制作一个 bash/perl/etc 脚本来更改它们的文件名,主要做三件事:

所以,换句话说..

'whatever_whatever2_whatever3.jpg'变成了'Whatever Whatever2 Whatever3.full.jpg'

非常欢迎任何帮助:)

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

#!/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])/\U/g;

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

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

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

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

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

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

这个 Perl 单行程序会按你的要求去做

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

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