Answers:
我曾经写过perl脚本来做到这一点,直到发现重命名命令为止。
它接受perl正则表达式进行重命名:
为此,我只键入了两个命令:
rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log
对于某些发行版,rename
它没有此功能(请参见其手册页),您可能必须安装perl-rename
或prename
。
mmv
但最终由于rename
我可以使用正则表达式的力量
perl-rename
。
由于我没有重命名命令,因此我依赖于此:
for myfile in /my/folder/*; do
target=$(echo $myfile|sed -e 's/foo/bar/g')
mv "$myfile" "$target"
done
rename
util不是很“标准”。每个发行版均附带不同的rename
工具。例如,在Gentoo上,rename
来自sys-apps/util-linux
软件包,不支持正则表达式。
Hamish Downer建议mmv
,它似乎很有用,特别是在脚本内部使用。
另一方面,在一般情况下,您可能需要namedutils。它具有qmv
和qcp
命令,这将打开您选择的文本编辑器(我的偏好:Vim),并允许您在此处编辑目标文件名。保存并关闭编辑器后,qmv
/ qcp
将进行所有重命名。
双方mmv
并qmv
都足够聪明,重命名以正确的顺序文件,并检测圆形重命名,并在必要时会自动创建一个临时文件。
sys-apps/rename
程序包,该程序包将为您提供renamexm
正则表达式重命名以及大写/小写和其他一些不错的功能。
公平起见:
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/A-Z/a-z/' System.20090101.log
给出正确的输出:
System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log
将{-n}开关替换为{-v}
我创建了一个小的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