我在寻找一个 Linux 命令行一行代码,可以一次性重命名一堆文件。
pattern1.a pattern1.b pattern1.c ...
执行命令后,我应该获得
pattern2.a pattern2.b pattern2.c ...
for i in pattern1.*; do mv -- "$i" "${i/pattern1/pattern2}"; done
在运行之前,在mv
前面加上echo
,以查看它将要执行的操作。
s/pattern1/pattern2/
无法工作的问题! - Corné Guijt有很多方法可以解决这个问题。如果您更喜欢将模式作为正则表达式而不是文件通配符,并且希望递归地进行更改,您可以使用类似于以下内容的代码:
find . -print | sed -ne '/^\.\/pattern1\(\..*\)/s//mv "&" "pattern2\1"/p'
正如Kerrek在他的回答中建议的那样,这个首先会向你展示它将要做什么。一旦你熟悉了命令,就可以通过shell管道输出(即在末尾添加| sh
)。
这对我很有效:
[ghoti@pc ~]$ ls -l foo.*
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 foo.php
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 foo.txt
[ghoti@pc ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p'
mv "./foo.txt" "bar.txt"
mv "./foo.php" "bar.php"
[ghoti@pc ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p' | sh
[ghoti@pc ~]$ ls -l foo.* bar.*
ls: foo.*: No such file or directory
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 bar.php
-rw-r--r-- 1 ghoti wheel 0 Mar 26 13:59 bar.txt
[ghoti@pc ~]$