是否有像 mv 这样的 linux 命令但带有正则表达式?

Jos*_*ibs 48 linux file-management regex rename

例如我想mv (.*?).sql $1.php

是否有一个命令可以让我指定重命名模式?

小智 34

正如其他人所提到的,rename它擅长于此,但man rename在尝试之前请阅读手册页 ( )。至少有两种完全不同的工具被称为rename,你拥有哪一种取决于你的发行版。错误地调用它们可能很危险。

这是Larry Wall 随 Ubuntu 一起提供的基于 perl 版本的手册页。你给它一个 perl 表达式rename 's/\.sql$/.php/' *.sql

这是旧 Red Hat 和 CentOS 发行版附带的重命名手册页。用法是简单的字符串替换,如rename .sql .php *.sql

您还可以使用 bash one-liner 一次处理一个文件:

$ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done
Run Code Online (Sandbox Code Playgroud)


Ada*_*eld 10

rename(1),它不使用正则表达式,但可以解决您的问题:

rename .sql .php *.sql
Run Code Online (Sandbox Code Playgroud)

还有mmv(1),但我不熟悉它的工作原理。


小智 6

G'day,

您也可以尝试输入

for i in $(\ls -d *.sql)
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done
Run Code Online (Sandbox Code Playgroud)

或者让它使用正则表达式的稍微改变它

for i in $(\ls -d | egrep -e '.*\.sql')
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done
Run Code Online (Sandbox Code Playgroud)

一些 shell 编码的乐趣。(-:

  • 这对于名称中包含空格的文件会失败,所以要小心。人们应该[永远不要解析`ls`输出](http://mywiki.wooledge.org/ParsingLs)。 (2认同)