【发布时间】:2010-09-29 21:29:39
【问题描述】:
我需要像这样重命名文件名
transform.php?dappName=Test&transformer=YAML&v_id=XXXXX
就这个
XXXXX.txt
我该怎么做?
我知道我需要多个 mv 命令,因为它们至少有 25000 个文件。
【问题讨论】:
我需要像这样重命名文件名
transform.php?dappName=Test&transformer=YAML&v_id=XXXXX
就这个
XXXXX.txt
我该怎么做?
我知道我需要多个 mv 命令,因为它们至少有 25000 个文件。
【问题讨论】:
vimv 允许您使用 Vim 的文本编辑功能重命名多个文件。
输入vimv 会打开一个列出所有文件的 Vim 窗口,您可以进行模式匹配、视觉选择等来编辑名称。退出 Vim 后,文件将被重命名。
[免责声明:我是该工具的作者]
【讨论】:
这个renamer 命令可以做到:
$ renamer --regex --find 'transform.php?dappName=Test&transformer=YAML&v_id=(\w+)' --replace '$1.txt' *
【讨论】:
最简单的解决方案是使用 "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 发行版中不是标准的,但在网上很容易找到。
【讨论】:
mmv 引发错误。
这也应该有效:
prfx='transform.php?dappName=Test&transformer=YAML&v_id='
ls $prfx* | sed s/$prfx// | xargs -Ipsx mv "$prfx"psx psx
【讨论】:
我会使用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
【讨论】:
好的,您需要能够为此运行 Windows 二进制文件。
但如果你可以运行Total Commander,请执行以下操作:
选择所有带 * 的文件,然后按 ctrl-M
在搜索字段中,粘贴“transform.php?dappName=Test&transformer=YAML&v_id="
(将替换留空)
按开始
没有比这更简单的了。 您还可以通过此对话框使用正则表达式重命名,并实时预览文件将如何重命名。
【讨论】:
您编写了一个相当简单的 shell 脚本,其中最棘手的部分是修改名称。
脚本的大纲很简单(这里是bash语法):
for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
do
mv $i <modified name>
done
修改名称有很多选择。我认为最简单的可能是 awk one-liner like
`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
【讨论】:
for 循环不受“命令行太长”限制,因此您的第一种方法也可以对于很长的文件列表;见this answer。
find -name '*v_id=*' | perl -lne'rename($_, qq($1.txt)) if /v_id=(\S+)/'
【讨论】:
您可以使用任何您想转换的名称(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)
旁注:您可以更轻松地保存具有正确名称的页面,同时抓取它们...
【讨论】:
glob.iglob()) 有更好的机会处理 100000 个文件。
如果您使用的是 zsh,您也可以这样做:
autoload zmv
zmv 'transform.php?dappName=Test&transformer=YAML&v_id=(*)' '$1.txt'
【讨论】:
或者您可以将 ls 的结果通过管道传输到 perl 正则表达式中。
【讨论】:
rename 命令做到这一点的?