求助关于批量改文件的扩展名

sh/bash/dash/ksh/zsh等Shell脚本
anguste
帖子: 51
注册时间: 2006-10-05 17:27

求助关于批量改文件的扩展名

#1

帖子 anguste » 2011-07-09 8:59

出于某种诡异的原因我的下载机(MSS)会把任何大于2G的文件自动分割成不大于2G一个的文件

假设有个7G的a.mkv,我最终获得的是a.mkv000,a.mkv001,a.mkv002,a.mkv003这样4个文件

现在我已知有个叫HJSplit的软件 可以把这类文件合并起来,前提是他们是这样的文件名结构
a.mkv.001,a.mkv.002,a.mkv.003,a.mkv.004
这样合并后会自动生成一个a.mkv文件

请问用什么脚本可以实现这样的操作呢?如果文件数量太多,手动改名实在是太让人崩溃了。。。
MaskRay
帖子: 61
注册时间: 2010-04-29 22:00
系统: Gentoo Linux ~amd64
联系:

Re: 求助关于批量改文件的扩展名

#2

帖子 MaskRay » 2011-07-09 9:54

分割

代码: 全选

split -a 3 -b 2000m
max 1p split 看用法

---

合并

代码: 全选

setopt numericglobsort && cat * > file
zsh 的
anguste
帖子: 51
注册时间: 2006-10-05 17:27

Re: 求助关于批量改文件的扩展名

#4

帖子 anguste » 2011-07-09 11:46

MaskRay 写了:分割

代码: 全选

split -a 3 -b 2000m
max 1p split 看用法

---

合并

代码: 全选

setopt numericglobsort && cat * > file
zsh 的
呃,我没有问分割合并的方法,只是想批量把文件名给改了
anguste
帖子: 51
注册时间: 2006-10-05 17:27

Re: 求助关于批量改文件的扩展名

#5

帖子 anguste » 2011-07-09 11:46

ubuntu1023 写了:分割成的文件1个2G,不会太多,高清也就5、6个,手动修改扩展名即可
以前是手动改的,但是片子多了太痛苦了
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 求助关于批量改文件的扩展名

#6

帖子 eexpress » 2011-07-09 21:13

你目的不就是分割合并嘛。

是已经下载的文件,就是那种后缀名?如果是这情况,你可以看下

rename 's/mkv/mkv\./' a.*
● 鸣学
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助关于批量改文件的扩展名

#7

帖子 fnan » 2011-07-10 3:20

设文件在b文件夹,a.mkv000 改成 a.mkv_001 ,要加_不然就把另外的文件覆盖了,数字不必要连续,全部加一:
kose5@kose5-Aspire-4552:~$ cd b;ls -1|while read n;do a=($(sed 's#\(.*\)\([0-9]\{3\}\)$#\1 \2#' <<<$n ));mv $n ${a[0]}"_"$(printf "%03d" $((${a[1]/#?(0|00)}+1)));done;cd
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
anguste
帖子: 51
注册时间: 2006-10-05 17:27

Re: 求助关于批量改文件的扩展名

#8

帖子 anguste » 2011-07-10 10:58

fnan 写了:设文件在b文件夹,a.mkv000 改成 a.mkv_001 ,要加_不然就把另外的文件覆盖了,数字不必要连续,全部加一:
kose5@kose5-Aspire-4552:~$ cd b;ls -1|while read n;do a=($(sed 's#\(.*\)\([0-9]\{3\}\)$#\1 \2#' <<<$n ));mv $n ${a[0]}"_"$(printf "%03d" $((${a[1]/#?(0|00)}+1)));done;cd

代码: 全选

ls -1|while read n;do a=($(sed 's#\(.*\)\([0-9]\{3\}\)$#\1 \2#' <<<$n ));mv $n ${a[0]}"."$(printf "%03d" $((${a[1]/#?(0|00)}+1)));done
此法可行,感激涕零!!!

在我的实际应用中把_替换成.了

想问下如果文件名不是a,应该改哪些地方?
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: 求助关于批量改文件的扩展名

#9

帖子 ChenFengyuan » 2011-07-10 11:15

anguste 写了:
fnan 写了:设文件在b文件夹,a.mkv000 改成 a.mkv_001 ,要加_不然就把另外的文件覆盖了,数字不必要连续,全部加一:
kose5@kose5-Aspire-4552:~$ cd b;ls -1|while read n;do a=($(sed 's#\(.*\)\([0-9]\{3\}\)$#\1 \2#' <<<$n ));mv $n ${a[0]}"_"$(printf "%03d" $((${a[1]/#?(0|00)}+1)));done;cd

代码: 全选

ls -1|while read n;do a=($(sed 's#\(.*\)\([0-9]\{3\}\)$#\1 \2#' <<<$n ));mv $n ${a[0]}"."$(printf "%03d" $((${a[1]/#?(0|00)}+1)));done
此法可行,感激涕零!!!

在我的实际应用中把_替换成.了

想问下如果文件名不是a,应该改哪些地方?
你直接把ee给出的忽略了呀。。。。。。
重命名,最nb的就是rename(perl版本的),没有之一.
debian里貌似装了perl就有带,
这么长的一段代码.......
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: 求助关于批量改文件的扩展名

#10

帖子 ChenFengyuan » 2011-07-10 11:16

eexpress 写了:你目的不就是分割合并嘛。

是已经下载的文件,就是那种后缀名?如果是这情况,你可以看下

rename 's/mkv/mkv\./' a.*
此处.无需转义
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: 求助关于批量改文件的扩展名

#11

帖子 ChenFengyuan » 2011-07-10 11:18

MaskRay 写了:分割

代码: 全选

split -a 3 -b 2000m
max 1p split 看用法

---

合并

代码: 全选

setopt numericglobsort && cat * > file
zsh 的
都001,002,就无所谓numericglobsort了吧.
如果楼主的那个啥软件是简单的分割的,好像split,根本不用啥xxx软件,就像maskray说的,直接cat *>foo即可.
也不用改名了.
楼主有没有文件效验的?合成之后效验即可.
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: 求助关于批量改文件的扩展名

#12

帖子 ChenFengyuan » 2011-07-10 11:28

非得用shell的话
for a in *;do mv -v $a $(echo $a|sed -e 's/mkv/mkv./');done
dash都支持,估计没问题了.
头像
lainme
论坛版主
帖子: 7805
注册时间: 2008-09-13 19:17
系统: Arch Linux (x86_64)
联系:

Re: 求助关于批量改文件的扩展名

#13

帖子 lainme » 2011-07-10 11:29

确实,你的目的就是合并。改名是为了用那个专门的软件来做合并这件事。

但其实你不该名,用cat就合并了,何必多做一步

想这样的结构:a.mkv000,a.mkv001,a.mkv002,a.mkv003

直接

cat a.mkv* > a.mkv

就可以了
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: 求助关于批量改文件的扩展名

#14

帖子 ChenFengyuan » 2011-07-10 11:38

或者如果你用zsh或bash,
应该可以
for i in *;do mv -v $i ${i/mkv/mkv./};done
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: 求助关于批量改文件的扩展名

#15

帖子 ChenFengyuan » 2011-07-10 12:05

lainme 写了:确实,你的目的就是合并。改名是为了用那个专门的软件来做合并这件事。

但其实你不该名,用cat就合并了,何必多做一步

想这样的结构:a.mkv000,a.mkv001,a.mkv002,a.mkv003

直接

cat a.mkv* > a.mkv

就可以了
:em11
回复