使用正则expression式在Linux中重命名文件

我有一组文件,我想一致重命名,文件被命名为像

"System-Log-01-01-2009-NODATA.txt" "Something-Log-01-01-2009-NODATA.txt" 

我希望它们是小写,yyyymmdd,.log扩展名

 "system.20090101.log" "something.20090101.log" 

我曾经写Perl脚本来做到这一点,直到我发现重命名命令。

它接受一个perl正则expression式来执行重命名:

为此,我只input了两个命令:

 rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' * rename 'y/AZ/az/' *.log 

由于我没有重命名命令,我依靠这个:

 for myfile in /my/folder/*; do target=$(echo $myfile|sed -e 's/foo/bar/g') mv "$myfile" "$target" done 

mmv是移动/重命名多个文件的标准linux工具。 对于大多数发行版来说,它可以从回购版中获得。 对于上面的例子,你可以这样做:

 mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log 

欲了解更多信息,请阅读此debaday文章或手册页 。

rename util不是很“标准”。 每个发行版附带一个不同的rename工具。 例如,在Gentoo上, rename是来自sys-apps/util-linux软件包,不支持正则expression式。

Hamish Downerbuild议mmv ,它似乎很有用,专门用于内部脚本。

另一方面,对于一般情况,您可能需要renameutils 。 它有qmvqcp命令,这将打开你select的文本编辑器(我的首选项:Vim),并允许你在那里编辑目的文件名。 保存并closures编辑器后, qmv / qcp将完成所有重命名。

mmvqmv都足够聪明,可以按照正确的顺序重命名文件,也可以检测循环重命名,并根据需要自动创build一个临时文件。

公平起见:

 rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt 

给出这个输出:

 Use of uninitialized value $4 in regexp compilation at (eval 1) line 1. Use of uninitialized value $3 in regexp compilation at (eval 1) line 1. Use of uninitialized value $2 in regexp compilation at (eval 1) line 1. 

但:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/AZ/az/' System.20090101.log

给出正确的输出:

 System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log System.20090101.log renamed as system.20090101.log 

用{-v}replace{-n}开关

我创build了一个小bash脚本来做到这一点:

 #!/bin/bash for f in `ls /path/to/folder`; do # Create new filename from the old one # This example replaces A (upper case) with a (lower case) new_file=`echo "$new_file" | tr A a` # Rename the file mv "$f" "$new_file" done