我有许多文件,例如 file_022.bmp、file_023.bmp...file_0680.bmp。我需要将它们重命名为更方便的名称,例如 file_1.bmp、file_2.bmp...file_658.bmp。
是否有我可以编写的 bash 脚本来为我执行此操作?感谢您的帮助和建议。
卢克 H
如果您使用的是基于 debian 的 linux 系统,那么您可以使用接受正则表达式的重命名脚本来重命名文件。更多信息,因为我发现很难找到手册页。
例如
harald@Midians_Gate:~$ ls p*.php
parse.php pd.php pgrep.php preg_based.php proc.php
假设我想将扩展名更改为 .perl 并在名称前加上 file_ 然后我使用命令:
rename -n 's/([a-z]*)\.php/file_$1.perl/' p*.php
会给
parse.php renamed as file_parse.perl
pd.php renamed as file_pd.perl
pgrep.php renamed as file_pgrep.perl
preg_based.php renamed as preg_file_based.perl
proc.php renamed as file_proc.perl
我选择并捕获基本文件名([a-z]*)
,然后在替换中使用它,并使用常规字符串$1
附加.perl
和前置 $1file_
-n 选项使其在不更改任何内容的情况下测试运行
正如您从这个示例中看到的那样,您需要正确考虑选择正则表达式,或者您会遇到类似上述 preg_based.php 的情况,您希望在其中使用 file_preg_based.perl :) 来补偿我需要在([a-z_]*)
这里使用的情况
这是我一直坚持使用 debian 的众多原因之一,不过我很想找到其他非 debian 系统的等价物:-/
如果您有文件 a.bmp、b.bmp、c.bmp 并且您希望以 file_1.bmp、file_2.bmp、file_3.bmp 结尾
使用 bash:
mkdir result
index=1
for i in *.bmp
do
mv "$i" "result/file_"$((index++)).bmp
done
注意:建议使用子目录以避免意外覆盖看起来像 file_xx.bmp 的文件
如果扩展后有太多文件无法放入命令行,则可以使用以下内容:
mkdir result
index=1
find . -name "*.bmp" | while read i
do
echo mv "$i" "result/file_"$((index++)).bmp
done
检查输出后删除“回声”