![调整文件名的字符顺序(批量)](https://linux22.com/image/1169227/%E8%B0%83%E6%95%B4%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E5%AD%97%E7%AC%A6%E9%A1%BA%E5%BA%8F%EF%BC%88%E6%89%B9%E9%87%8F%EF%BC%89.png)
我有几个按日期命名的文件,我正在尝试批量更改命名
它们看起来像这样:
dd-mm-yyyy or dd.mm.yyyy or ddjanyyyy
我试图将每个人都标准化,如下所示:
yyyy-mm-dd-file-name-default
答案1
如果您确实只需要“调整字符顺序”,那么使用基于 Perl 的rename
命令、使用捕获组和反向引用就相当简单了。
例如给定
$ ls
000000 02jan1999 19.11.2017 23-11-2012 file
然后
$ rename -n 's/(\d{2})[-.](\d{2})[-.](\d{4})/$3-$2-$1-file-name-default/' *
rename(19.11.2017, 2017-11-19-file-name-default)
rename(23-11-2012, 2012-11-23-file-name-default)
另一方面,如果你想要进行像jan
--> 这样的日期转换01
,那么它会更复杂一些。你可以使用哈希编写自己的查找表,或者使用模块提供的strptime
和方法:strftime
Time::Piece
$ rename -n '
BEGIN{use Time::Piece};
my $dt;
eval {
$dt = Time::Piece->strptime($_,"%d-%m-%Y");
} or do {
eval {
$dt = Time::Piece->strptime($_,"%d.%m.%Y");
} or do {
eval {
$dt = Time::Piece->strptime($_,"%d%b%Y");
} or return;
}
};
$_ = $dt->strftime("%Y-%m-%d-file-name-default")
' *
rename(02jan1999, 1999-01-02-file-name-default)
rename(19.11.2017, 2017-11-19-file-name-default)
rename(23-11-2012, 2012-11-23-file-name-default)