如何进行大规模重命名?

25 unix shell rename

我需要重命名这样的文件名

transform.php?dappName=Test&transformer=YAML&v_id=XXXXX
Run Code Online (Sandbox Code Playgroud)

就是这样

XXXXX.txt
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

我知道我需要多个mv命令,因为它们至少有25000个文件.

nim*_*odm 48

最简单的解决方案是使用"mmv"

你可以写:

mmv "long_name*.txt" "short_#1.txt"
Run Code Online (Sandbox Code Playgroud)

其中"#1"被第一个通配符匹配的任何内容替换.类似地,#2被第二个等替换.

所以你做的事情就像

mmv "index*_type*.txt" "t#2_i#1.txt"
Run Code Online (Sandbox Code Playgroud)

要将index1_type9.txt重命名为t9_i1.txt

mmv在许多Linux发行版中都不是标准版,但很容易在网上找到.


d0k*_*d0k 19

如果您使用zsh,您也可以这样做:

autoload zmv
zmv 'transform.php?dappName=Test&transformer=YAML&v_id=(*)' '$1.txt'
Run Code Online (Sandbox Code Playgroud)

  • 即使他正在使用bash,他总是可以运行zsh然后使用这个答案. (4认同)

Cha*_*tin 13

你编写了一个相当简单的shell脚本,其中最棘手的部分是重命名.

脚本的大纲很简单(bash语法在这里):

for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
do
    mv $i <modified name>
done
Run Code Online (Sandbox Code Playgroud)

修改名称有很多选项.我认为最简单的可能就是像单行的一样

`echo $i  |  awk -F'=' '{print $4}'`
Run Code Online (Sandbox Code Playgroud)

所以...

for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
do
    mv $i `echo $i |  awk -F'=' '{print $4}'`.txt 
done
Run Code Online (Sandbox Code Playgroud)

更新

好的,正如下面所指出的,这不一定适用于足够大的文件列表;*将超出命令行长度限制.那么,你使用:

$ find . -name 'transform.php?dappName=Test&transformer=YAML&v_id=*' -prune -print |
while read
do
    mv $reply `echo $reply |  awk -F'=' '{print $4}'`.txt 
done
Run Code Online (Sandbox Code Playgroud)

  • 也许是这样,但并非所有 UNIX 系统(例如,不在我的 Mac 上)*并且*这是可以应用于其他问题的通用模式。 (2认同)

bri*_*ien 5

尝试重命名命令

或者你可以将ls的结果输入到perl正则表达式中.