分页: 2 / 3
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-10 12:32
由 anguste
lainme 写了:确实,你的目的就是合并。改名是为了用那个专门的软件来做合并这件事。
但其实你不该名,用cat就合并了,何必多做一步
想这样的结构:a.mkv000,a.mkv001,a.mkv002,a.mkv003
直接
cat a.mkv* > a.mkv
就可以了
呃,这样也可以的。我先前没有试过这个是因为在win下面用简单的copy拼接出来的视频是不能看的,不知何解。。。
当然,cat虽然简单但缺点是对于很大的文件无法得知合并的进度,也就不知道需要多少时间了。
anyway,学到很多,谢谢大家
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-10 13:28
由 ChenFengyuan
anguste 写了:lainme 写了:确实,你的目的就是合并。改名是为了用那个专门的软件来做合并这件事。
但其实你不该名,用cat就合并了,何必多做一步
想这样的结构:a.mkv000,a.mkv001,a.mkv002,a.mkv003
直接
cat a.mkv* > a.mkv
就可以了
呃,这样也可以的。我先前没有试过这个是因为在win下面用简单的copy拼接出来的视频是不能看的,不知何解。。。
当然,cat虽然简单但缺点是对于很大的文件无法得知合并的进度,也就不知道需要多少时间了。
anyway,学到很多,谢谢大家
合并进度?
pv a.mkv* > foo
这样有进度了.
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-10 22:07
由 fnan
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,应该改哪些地方?
文件名不重要,只自动改数字,不改文件名,数字前的.自己改。
合并的话其实cat就行,bash本身只有简单语法,命令会长些,特定需要精确控制的时候会有用,给出改名算法是不想被误解bash语法什么都不能做,和或许对有需要的人有启发而已。
还是显示一下吧:
kose3@kose3-desktop:~$ ls b
kose3@kose3-desktop:~$ touch b/{a,b,c}.mkv{000,001,002,003}
kose3@kose3-desktop:~$ ls b
a.mkv000 a.mkv001 a.mkv002 a.mkv003 b.mkv000 b.mkv001 b.mkv002 b.mkv003 c.mkv000 c.mkv001 c.mkv002 c.mkv003
kose3@kose3-desktop:~$ 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
kose3@kose3-desktop:~$ ls b
a.mkv.001 a.mkv.002 a.mkv.003 a.mkv.004 b.mkv.001 b.mkv.002 b.mkv.003 b.mkv.004 c.mkv.001 c.mkv.002 c.mkv.003 c.mkv.004
kose3@kose3-desktop:~$
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-10 22:38
由 fnan
kose3@kose3-desktop:~/b$ ls
a.mkv000 a.mkv001 a.mkv002 a.mkv003 b.mkv000 b.mkv001 b.mkv002 b.mkv003 c.mkv000 c.mkv001 c.mkv002 c.mkv003
kose3@kose3-desktop:~/b$ rename 's/mkv/mkv\./' a.*
kose3@kose3-desktop:~/b$ ls
a.mkv.000 a.mkv.001 a.mkv.002 a.mkv.003 b.mkv000 b.mkv001 b.mkv002 b.mkv003 c.mkv000 c.mkv001 c.mkv002 c.mkv003
kose3@kose3-desktop:~/b$ rename 's/mkv/mkv\./' *.*
kose3@kose3-desktop:~/b$ ls
a.mkv..000 a.mkv..001 a.mkv..002 a.mkv..003 b.mkv.000 b.mkv.001 b.mkv.002 b.mkv.003 c.mkv.000 c.mkv.001 c.mkv.002 c.mkv.003
kose3@kose3-desktop:~/b$ rm *
kose3@kose3-desktop:~/b$ touch {a,b,c}.mkv{000,001,002,003}
kose3@kose3-desktop:~/b$ rename 's/mkv/mkv\./' *.mkv*
kose3@kose3-desktop:~/b$ ls
a.mkv.000 a.mkv.001 a.mkv.002 a.mkv.003 b.mkv.000 b.mkv.001 b.mkv.002 b.mkv.003 c.mkv.000 c.mkv.001 c.mkv.002 c.mkv.003
kose3@kose3-desktop:~/b$
请教如何用rename能得到预期效果,perl不会。
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-10 22:52
由 fnan
如果想要这效果:
kose3@kose3-desktop:~/b$ ls
a.mkv000 a.mkv002 a.mkv004
kose3@kose3-desktop:~/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
kose3@kose3-desktop:~/b$ ls
a.mkv.001 a.mkv.003 a.mkv.005
rename可以吗?
kose3@kose3-desktop:~/b$ rm *
kose3@kose3-desktop:~/b$ touch a.mkv{000,002,004}
kose3@kose3-desktop:~/b$ ls
a.mkv000 a.mkv002 a.mkv004
kose3@kose3-desktop:~/b$ rename 's/mkv/mkv\./' a.*
kose3@kose3-desktop:~/b$ ls
a.mkv.000 a.mkv.002 a.mkv.004
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-10 23:31
由 fnan
如果HJSplit的软件能自动按文件名把文件夹里的上万视频自动处理好,用bash命令自动处理上万的文件名是 有价值的,rename能自动搞定不同的视频名吗?cat处理一个视频的零散文件名还可以,上万呢?还是要bash语法上阵,有点技术细节狂,不要误会pk。
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-11 7:40
由 ChenFengyuan
fnan 写了:如果想要这效果:
kose3@kose3-desktop:~/b$ ls
a.mkv000 a.mkv002 a.mkv004
kose3@kose3-desktop:~/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
kose3@kose3-desktop:~/b$ ls
a.mkv.001 a.mkv.003 a.mkv.005
rename可以吗?
kose3@kose3-desktop:~/b$ rm *
kose3@kose3-desktop:~/b$ touch a.mkv{000,002,004}
kose3@kose3-desktop:~/b$ ls
a.mkv000 a.mkv002 a.mkv004
kose3@kose3-desktop:~/b$ rename 's/mkv/mkv\./' a.*
kose3@kose3-desktop:~/b$ ls
a.mkv.000 a.mkv.002 a.mkv.004
可以
代码: 全选
$ touch a.mkv{000,002,004}
$ rename -v 's/(?<![.\d])(\d++)$/sprintf ".%0".length($1)."d",$1+1/e' *
a.mkv000 renamed as a.mkv.001
a.mkv002 renamed as a.mkv.003
a.mkv004 renamed as a.mkv.005
$ rename -v 's/(?<![.\d])(\d++)$/sprintf ".%0".length($1)."d",$1+1/e' *
$ touch a.mkv{000000,00002,00000000004}
$ rename -v 's/(?<![.\d])(\d++)$/sprintf ".%0".length($1)."d",$1+1/e' *
a.mkv000000 renamed as a.mkv.000001
a.mkv00000000004 renamed as a.mkv.00000000005
a.mkv00002 renamed as a.mkv.00003
$ ls
a.mkv.00000000005 a.mkv.000001 a.mkv.00003 a.mkv.001 a.mkv.003 a.mkv.005

Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-11 7:53
由 ChenFengyuan
代码: 全选
cfy@debian:/dev/shm/testn$ ls
a.mkv000 a.mkv000000 a.mkv00000000004 a.mkv00002 a.mkv002 a.mkv004
cfy@debian:/dev/shm/testn$ 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
cfy@debian:/dev/shm/testn$ ls
a.mkv00000000.005 a.mkv000.001 a.mkv00.003 a.mkv.001 a.mkv.003 a.mkv.005
cfy@debian:/dev/shm/testn$
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-11 7:56
由 ChenFengyuan
fnan 写了:如果HJSplit的软件能自动按文件名把文件夹里的上万视频自动处理好,用bash命令自动处理上万的文件名是 有价值的,rename能自动搞定不同的视频名吗?cat处理一个视频的零散文件名还可以,上万呢?还是要bash语法上阵,有点技术细节狂,不要误会pk。
rename其实可以理解为有perl在后面,所以,你说是不是最强悍的。
如果是对n个不同的视频,就写脚本嘛,没啥丢脸的,hjsplit还是一个软件了。
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-11 7:58
由 ChenFengyuan
to fnan,你的bash也太长了。。。。。原来是要有+1的效果。。。。
交给perl好了。写得又短又漂亮。

Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-12 0:51
由 fnan
ChenFengyuan 写了:to fnan,你的bash也太长了。。。。。原来是要有+1的效果。。。。
交给perl好了。写得又短又漂亮。

确是还能突破,谢谢提醒。不过能短多少呢?无需太执着吧。
ls -1|while read n;do z=${n/#*[!0-9]};mv $n ${n/%*([0-9])}$(printf ".%0${#z}d" $((${z/#*(0)}+1)));done
rename -v 's/(?<![.\d])(\d++)$/sprintf ".%0".length($1)."d",$1+1/e' *
ls
a.12mkv000103 a.mkv000 a.mkv000000 a.mkv00000000004 a.mkv00002 a.mkv002 a.mkv004
ls -1|while read n;do z=${n/#*[!0-9]};mv $n ${n/%*([0-9])}$(printf ".%0${#z}d" $((${z/#*(0)}+1)));done
ls
a.12mkv.000104 a.mkv.00000000005 a.mkv.000001 a.mkv.00003 a.mkv.001 a.mkv.003 a.mkv.005
ls -1|while read n;do z=${n/#*[!0-9]};mv $n ${n/%*([0-9])}$(printf ".%0${#z}d" $((${z/#*(0)}+1)));done
ls
a.12mkv..000105 a.mkv..00000000006 a.mkv..000002 a.mkv..00004 a.mkv..002 a.mkv..004 a.mkv..006
ls
a.12mkv000103 a.mkv000 a.mkv000000 a.mkv00000000004 a.mkv00002 a.mkv002 a.mkv004
rename -v 's/(?<![.\d])(\d++)$/sprintf ".%0".length($1)."d",$1+1/e' *
ls
a.12mkv.000104 a.mkv.00000000005 a.mkv.000001 a.mkv.00003 a.mkv.001 a.mkv.003 a.mkv.005
rename -v 's/(?<![.\d])(\d++)$/sprintf ".%0".length($1)."d",$1+1/e' *
ls
a.12mkv.000104 a.mkv.00000000005 a.mkv.000001 a.mkv.00003 a.mkv.001 a.mkv.003 a.mkv.005
多个点就不工作了,改一下吧。
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-12 1:51
由 我就是我2
觉得ee的方法很好,简洁
不过先要安装perl-rename
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-12 3:31
由 fnan
再突破一下:
ls -1|while read n;do z=$((1${n##*[!0-9]}+1));mv $n ${n%%*([0-9])}.${z:1};done
rename -v 's/(?<![.\d])(\d++)$/sprintf ".%0".length($1)."d",$1+1/e' *
差不多了。
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-12 3:33
由 fnan
我就是我2 写了:觉得ee的方法很好,简洁
不过先要安装perl-rename
是不错,不够通用。
Re: 求助关于批量改文件的扩展名
发表于 : 2011-07-12 13:05
由 我就是我2
fnan 写了:我就是我2 写了:觉得ee的方法很好,简洁
不过先要安装perl-rename
是不错,不够通用。
个人认为,解决问题,应该使用比较简单的方法,试图通用,最后会搞得很复杂的。当然作为练习并没有什么大的问题。
ps:通用,我觉得我要用thunar来修改了。我并不排斥使用图形界面。