关于Unix:如何进行批量重命名?

How to do a mass rename?

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

1
transform.php?dappName=Test&transformer=YAML&v_id=XXXXX

只是这个

1
XXXXX.txt

我该怎么做?

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


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

你可以写:

1
mmv"long_name*.txt""short_#1.txt"

其中"#1"被第一个通配符匹配的内容替换。
类似地,#2被第二个替换,依此类推。

所以你做类似的事情

1
mmv"index*_type*.txt""t#2_i#1.txt"

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

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


如果您使用的是zsh,也可以执行以下操作:

1
2
autoload zmv
zmv 'transform.php?dappName=Test&transformer=YAML&v_id=(*)' '$1.txt'


您编写了一个相当简单的shell脚本,其中最棘手的部分是修改名称。

脚本的轮廓很简单(此处为bash语法):

1
2
3
4
for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
do
    mv $i <modified name>
done

修改名称有很多选项。我认为最简单的方法可能是

1
`echo $i  |  awk -F'=' '{print $4}'`

所以...

1
2
3
4
for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
do
    mv $i `echo $i |  awk -F'=' '{print $4}'`.txt
done

更新

好的,正如下面所指出的,这不一定适用于足够大的文件列表。 *将超出命令行长度限制。因此,您可以使用:

1
2
3
4
5
$ 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


尝试重命名命令

或者,您可以将ls的结果传递给perl regex。


1
find -name '*v_id=*' | perl -lne'rename($_, qq($1.txt)) if /v_id=(\S+)/'


您可以使用任何要转换名称的名称(perl,sed,awk等)。我将使用python一线式:

1
2
3
for file in 'transform.php?dappName=Test&transformer=YAML&v_id='*; do
    mv $file `echo $file | python -c"print raw_input().split('=')[-1]"`.txt;
done

这是完全在Python中的相同脚本:

1
2
3
4
5
6
7
import glob, os
PATTERN="transform.php?dappName=Test&transformer=YAML&v_id=*"

for filename in glob.iglob(PATTERN):
      newname = filename.split('=')[-1] +".txt"
      print filename, '==>', newname
      os.rename(filename, newname)

旁注:您将可以更轻松地保存带有正确名称的页面,同时抓取它们...


vimv使您可以使用Vim的文本编辑功能重命名多个文件。

输入vimv将打开一个Vim窗口,其中列出了所有文件,您可以进行模式匹配,视觉选择等编辑名称。退出Vim后,文件将被重命名。

[免责声明:我是该工具的作者]


我将使用ren-regexp,它是一个Perl脚本,可让您非常轻松地重命名文件。

1
2
3
4
5
6
7
8
9
10
11
21:25:11 $ ls
transform.php?dappName=Test&transformer=YAML&v_id=12345

21:25:12 $ ren-regexp 's/transform.php.*v_id=(\d+)/$1.txt/' transform.php*

  transform.php?dappName=Test&transformer=YAML&v_id=12345
1 12345.txt


21:26:33 $ ls
12345.txt

这个重命名器命令可以做到:

1
$ renamer --regex --find 'transform.php?dappName=Test&transformer=YAML&v_id=(\w+)' --replace '$1.txt' *

这也应该起作用:

prfx ='transform.php?dappName = Test&transformer = YAML&v_id ='

ls $ prfx * | sed s / $ prfx // | | xargs -Ipsx mv" $ prfx" psx psx


好的,您需要能够为此运行Windows二进制文件。

但是,如果可以运行Total Commander,请执行以下操作:

  • 选择所有带有*的文件,然后按ctrl-M

  • 在"搜索"字段中,粘贴" transform.php?dappName = Test&transformer = YAML&v_id ="

    (保留替换为空)

  • 按开始

  • 没有比这更简单的了。
    您也可以通过此对话框使用正则表达式进行重命名,并且可以实时预览如何重命名文件。