我想批量重命名目录中的一些文件,以便从文件名中去除前面的数字和henn。
Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW New file name: XXX_01_xxxx_20130730235001_00000000.NEW
我怎样才能做到这一点与Linux命令?
通过命令行将目录树复制到单个目录
这应该使它:
rename 's/^[0-9]*-//;' *
它从头开始块[0-9] (即数字)多次,然后连字符-并从文件名删除它。
如果rename不在你的机器上,你可以使用循环和mv :
mv "$f" "${f#[0-9]*-}"
测试
$ ls 23-aa hello aaa23-aa $ rename 's/^[0-9]*-//;' * $ ls aa hello aaa23-aa
要么:
$ ls 23-a aa23-a hello $ for f in *; > do > mv "$f" "${f#[0-9]*-}" > done $ ls a aa23-a hello
我觉得这个命令会更好,如果你执行下面的命令:
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv
这里
sed -e – 执行表达式
s / old-name / new-name / – 生成新的文件名
xargs -n2 – 处理mv的两个参数
MV – 获取两个参数,并执行移动操作
建议:在执行mv之前,验证你所做的是你想用echo实现的。
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo
以下示例重命名
SCCF099_FG.gz5329223404623884757.tmp 到
SCCF099_FG.gz
ls *tmp | sed -e 'p;s/([0-9])+.tmp/ /g' | xargs -n2 echo ls *tmp | sed -e 'p;s/([0-9])+.tmp/ /g' | xargs -n2 mv
如果第一个数字总是相同的长度:
for F in *new ; do mv $F ${F:8} done
${parameter:number}进行子字符串扩展 – 从第8个字符开始。
在扩展中还有许多其他字符串编辑可用于处理其他情况。
使用重命名 (Windows,Mac和Linux友好):
$ renamer --regex --find 'd+-(.*)' --replace '$1' *
这将从当前目录中的所有文件的开始剥离所有数字和第一个连字符。
进入vimv打开一个列出所有文件的Vim窗口,你可以进行模式匹配,视觉选择等来编辑名称。 在你退出Vim后,文件将被重命名。
[免责声明:我是该工具的作者]
这可能看起来有点复杂,但是它非常有效,在* nix和OSX系统上都能很好地工作。 它也以递归方式进行操作,重命名当前目录中的文件以及任何子目录:
find . -regex '.*/[0-9]{7}[-].*' -print > temp1 && cp temp1 temp2 && vi -c ":g/([0-9]{7}[-])(.*)/s//2/" -c ":x" temp2 && paste temp1 temp2 > temp3 && vi -c ":g/^/s//mv /" -c ":x" temp3 && sh ./temp3 && rm temp1 temp2 temp3
以下是刚刚发生的事情:
第一行说找到( find )所有文件,从当前目录( . )中的文件开始,其名称与“7个数字的后面跟一个破折号,后跟0个或更多个字符”的模式( -regex ) '.*/[0-9]{7}[-].*' ),并将这些文件名和它们各自的路径( -print )写入名为temp1 ( > temp1 )的文件。 请注意,在大多数情况下, -print指令可能不是必需的,但它不应该伤害任何东西。
find . -regex '.*/[0-9]{7}[-].*' -print > temp1 &&
然后,将temp1的内容复制( cp )到一个名为temp2的文件中。
cp temp1 temp2 &&
接下来,使用vi文本编辑器打开文件temp2并给vi两个命令(使用-c来表示每个新命令):
命令#1:
在temp2 ( :g )的每一行中搜索上面搜索的相同模式,除了这个时候使用圆括号( ([0-9]{7}[-])(.*) )。
对于每个匹配行,将光标移动到找到匹配的位置,并将整个匹配替换为匹配模式( 2 )的第二个组。
命令#2:
其结果是:
vi -c ":g/([0-9]{7}[-])(.*)/s//2/" -c ":x" temp2 &&
现在,将temp1与temp2 ( paste )的行连接起来, paste每个新组合的行写入一个名为temp3 ( > temp3 )的文件中。
paste temp1 temp2 > temp3 &&
接下来,再次运行vi ,执行与上面相同的步骤,除了这次搜索文件temp3内的每行( ^ )的开始并且在其之后( mv )之后添加mv和一个空格。
vi -c ":g/^/s//mv /" -c ":x" temp3 &&
然后,将temp3 ( ./temp3 )的内容作为shell脚本( sh )执行。
sh ./temp3 &&
rm temp1 temp2 temp3
你可以使用这个工具: rnm
代码做你想做的事情:
rnm /path/to/the/directory -fo -dp -1 -rs '/^d+-//' -ss '^d+-'
-fo仅用于文件模式
-dp是目录的深度( -1表示无限深度)。
-rs是替换字符串。 d+-正则表达式被空字符串替换。
-ss是搜索字符串,它使用^d+- regex搜索文件。 (虽然可以省略,但一些无害的错误消息将被打印在屏幕上)。
我真的很喜欢“重命名* .mp3 * .mp4”。
但没有其他答案给我这个。 所以我写了一个haskell程序来做到这一点。
https://hackage.haskell.org/package/batch-rename
有了这个你可以这样做:batch_rename“DCIM * .jpg”“* .png”
还有一个方便的GUI工具pyRenamer https://wiki.ubuntuusers.de/pyRenamer/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。