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.
#!/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
我曾经编写 perl 脚本来执行此操作,直到我发现了 rename 命令。
它接受一个 perl 正则表达式来进行重命名:
为此,我只输入了两个命令:
但是,对于某些发行版,
rename
没有此功能(请参阅其手册页),您可能必须安装perl-rename
或prename
.mmv是一个标准的 linux 实用程序,用于移动/重命名多个文件。大多数发行版都可以从存储库中获得它。对于上面的示例,您可以执行以下操作:
有关更多信息,请阅读此debaday 文章或手册页。
因为我没有重命名命令,所以我依靠这个:
rename
util 不是很“标准”。每个发行版都附带不同的rename
工具。例如,在 Gentoo 上,rename
它来自sys-apps/util-linux
包并且不支持正则表达式。Hamish Downer建议
mmv
,它似乎很有用,特别是在脚本中使用。另一方面,对于一般情况,您可能需要renameutils。它有
qmv
和qcp
命令,它将打开您选择的文本编辑器(我的偏好:Vim)并允许您在那里编辑目标文件名。保存并关闭编辑器后,qmv
/qcp
将进行所有重命名。两者
mmv
都qmv
足够聪明,可以以正确的顺序重命名文件,还可以检测循环重命名,并在需要时自动创建一个临时文件。公平起见:
给出这个输出:
但:
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
给出正确的输出:
用 {-v} 替换 {-n} 开关
我创建了一个小 bash 脚本来执行此操作:
我偶然发现了一个名为 regex-rename 的 python 命令行工具,要安装它,只需运行:
要测试您的正则表达式:
实际重命名为: