我有一组文件,我想一致重命名,文件被命名为像
"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 。 它有qmv和qcp命令,这将打开你select的文本编辑器(我的首选项:Vim),并允许你在那里编辑目的文件名。 保存并closures编辑器后, qmv / qcp将完成所有重命名。
mmv和qmv都足够聪明,可以按照正确的顺序重命名文件,也可以检测循环重命名,并根据需要自动创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