How to do a mass rename?
我需要像这样重命名文件名
1 | transform.php?dappName=Test&transformer=YAML&v_id=XXXXX |
只是这个
1 | XXXXX.txt |
我该怎么做?
我知道我需要多个
最简单的解决方案是使用" 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的文本编辑功能重命名多个文件。
输入
[免责声明:我是该工具的作者]
我将使用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 ="
(保留替换为空)
按开始
没有比这更简单的了。
您也可以通过此对话框使用正则表达式进行重命名,并且可以实时预览如何重命名文件。