更改文件名首字母
Change filenames first letter
这是我需要做的一件有点具体的事情,在这个时候不能强迫我的大脑思考一个快速的方法来做这件事,所以这是我的问题:
我命名了很多文件,比方说:
word1_word2.ext
word3_word4.ext
word5_word5.ext
..
我需要在 osx 中制作一个 bash/perl/etc 脚本来更改它们的文件名,主要做三件事:
- 每个单词首字母大写
- 删除 _ 个字符
- 在名称后、扩展名前添加字符串“.full”
所以,换句话说..
'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.
。它对 tr
和 s
使用非破坏性 /r
修饰符,以便它们 return 修改后的字符串而不是编辑它就地。
这是我需要做的一件有点具体的事情,在这个时候不能强迫我的大脑思考一个快速的方法来做这件事,所以这是我的问题:
我命名了很多文件,比方说:
word1_word2.ext
word3_word4.ext
word5_word5.ext
..
我需要在 osx 中制作一个 bash/perl/etc 脚本来更改它们的文件名,主要做三件事:
- 每个单词首字母大写
- 删除 _ 个字符
- 在名称后、扩展名前添加字符串“.full”
所以,换句话说..
'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.
。它对 tr
和 s
使用非破坏性 /r
修饰符,以便它们 return 修改后的字符串而不是编辑它就地。