28

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

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

就这个

XXXXX.txt

我该怎么做?

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

4

11 回答 11

53

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

你可以写:

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

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

所以你做类似的事情

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

将 index1_type9.txt 重命名为 t9_i1.txt

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

于 2009-01-06T20:56:48.000 回答
19

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

autoload zmv
zmv 'transform.php?dappName=Test&transformer=YAML&v_id=(*)' '$1.txt'
于 2009-01-06T20:30:58.240 回答
13

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

脚本的大纲很简单(此处为 bash 语法):

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

修改名称有很多选择。我认为最简单的可能是 awk 单行

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

所以...

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

更新

好的,如下所述,这不一定适用于足够大的文件列表;* 将超出命令行长度限制。所以,然后你使用:

$ 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
于 2009-01-06T20:24:23.823 回答
5

尝试重命名命令

或者您可以将 ls 的结果通过管道传输到 perl 正则表达式中。

于 2009-01-06T20:21:30.833 回答
4

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

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 编写的相同脚本:

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)

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

于 2009-01-06T20:25:49.717 回答
4
find -name '*v_id=*' | perl -lne'rename($_, qq($1.txt)) if /v_id=(\S+)/'
于 2009-01-06T21:11:05.943 回答
1

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

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

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

于 2017-08-13T04:26:25.877 回答
0

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

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
于 2011-04-12T04:57:47.467 回答
-1

这个重命名器命令会这样做:

$ renamer --regex --find 'transform.php?dappName=Test&transformer=YAML&v_id=(\w+)' --replace '$1.txt' *
于 2013-10-04T16:49:56.233 回答
-1

这也应该有效:

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

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

于 2012-12-24T20:37:23.667 回答
-9

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

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

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

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

    将替换留空)

  3. 开始

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

于 2009-01-06T21:00:34.403 回答