您的位置:程序门 -> linux/unix社区 -> 程序开发区



求一个批量重命名文件的shell程序


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


求一个批量重命名文件的shell程序[已结贴,结贴人:nihao_010004]
发表于:2007-10-18 17:58:22 楼主

有一个文件夹,下面有100个文件,我想以1~100来命名这100文件,如何实现?
发表于:2007-10-18 18:09:331楼 得分:2
sf
发表于:2007-10-18 22:46:482楼 得分:3
a=1;   for   i   in   *;   do   echo   $i;   mv   $i   $a;   a=`expr   $a   +   1`;   done
发表于:2007-10-18 22:50:483楼 得分:3
batchfile code
~/bin/junk>a=1; for i in *; do echo $i; mv $i $a; a=`expr $a + 1 `; done


~/bin/junk> ls
total   12
4   ./     4   ../     4   file1     0   file2     0   file3     0   file4
~/bin/junk> a=1;   for   i   in   *;   do   echo   $i;   mv   $i   $a;   a=`expr   $a   +   1   `;   done
file1
file2
file3
file4
~/bin/junk> ls
total   12
4   ./     4   ../     4   1     0   2     0   3     0   4
发表于:2007-10-19 08:54:354楼 得分:3
        如果你使用的是windows   xp操作系统的话,要想批量重命名就很简单了。第一步:首先按自己的希望调整好文件顺序。第二步:全选所有文件,在第一个文件上击右键,重命名该文件(注意不要修改扩展名),如改为“tu(1).jpg”(注意:tu后面的括号和数字一定要在英文状态下输入),然后按回车,等一会就会全部重命名完毕。第一个文件为tu(1).jpg,第二个为tu(2).jpg,第三个为tu(3).jpg……以此类推。用这种方法同样可以批量重命名文件夹。
发表于:2007-10-19 09:02:055楼 得分:3
directory=test2/
num=1
ls   $directory ¦while   read   name
do
mv   $directory$name   $directory$num
num=`   expr   $num   +   1   `
done
发表于:2007-10-19 10:23:486楼 得分:0
shell的不知道.
发表于:2007-10-19 10:35:577楼 得分:3
#!/bin/bash

mydir=~/tmpdir/
num=1
for   i   in   `ls   ~/tmpdir`
do
mv   $mydir$i   $mydir$num
num=`expr   $num   +   1`
done
发表于:2007-10-19 11:48:208楼 得分:0
顶了,谢谢
发表于:2007-10-19 11:51:319楼 得分:3
上面很多人都给出答案了。ptf_phoenix的方式更标准一些。但是我觉得在   目录名和文件名之间也要有'/'.
因为如果目录名不以'/'结尾那么$directory$name这种写法就行不通。而/usr//local和/usr/local是一样的。
可以在ls的参数中指定排序方式。

另外借lz此贴,我顺便寻求一个批量改扩展名的shell脚本,lz不会介意吧?
如/home/name/doc下面有
a.asp   b.asp   aa.bb.asp   ...
分别改成
a.html   b.html   aa.bb.html   ...
怎么改?越简单越好。想了很久总是觉得麻烦。

windows   xp批量重命名能满足这些特殊要求吗?
发表于:2007-10-19 13:28:1110楼 得分:3
to   tpfly,   一个可考虑的方法:

cd   /home/name/doc   &&   for   i   in   *asp;do   mv   $i   `echo   $i   ¦   sed   's/\.asp/\.html/g'`;done

不过如果文件名很复杂,如有a.asp.asp或者其他方式则需要加额外处理
发表于:2007-10-19 15:34:5711楼 得分:3
嗯,sed是个不错的思路。
如果a.asp.asp我想可以用正则表达式
看来这可能是最简单的做法了。
发表于:2007-10-19 16:09:1112楼 得分:3
cd   /home/name/doc   &&   for   i   in   *asp;do   mv   $i   `echo   $i     |   sed     's#asp\$#html#g   '`;done  
可能这样稍微好一些,这样只会匹配最后的那个asp,就是文件名中间有.asp也不会出错了
发表于:2007-10-19 16:50:5213楼 得分:3
顶,我支持acange的解决方法,是unix下的方法,也是最简洁的方法。
发表于:2007-10-19 17:29:2414楼 得分:3
http://topic.csdn.net/u/20070330/07/182c8cdf-4471-4953-9ad7-733555f4e8fc.html
不太相干,但也是shell
发表于:2007-10-19 23:39:5915楼 得分:3
*不能匹配隐藏文件如   .hide,*asp也不能匹配   .aa.asp。
如果目录里没有匹配文件那么通配符只能保持原样。例如,如果目录里没有以a开头的文件那么echo   a*会是什么结果?它直接输出字符串   a*
还有用ls时也应该注意默认的选项和命令别名。ls   -a   列出除.   ..之外的文件和目录。如果有隐藏文件用这个。

我的完整程序:
#!/bin/bash
if   [   "$2"   =   ""   ]
then
exit   1
fi
old_ex="\.$1"
new_ex="\.$2"
if   [   "$1"   =   "@"   ]
then
old_ex=""
fi
if   [   "$2"   =   "@"   ]
then
new_ex=""
fi

for   i   in   `ls   -a   ¦   grep   $old_ex\$`
do
mv   $i   `echo   $i   ¦   sed   "s/$old_ex\$/$new_ex/g"`  
done
#end   of   file

把当前目录所有文件扩展名由参数1改成参数2,@表示空扩展名,即可以添加或去掉扩展名。
发表于:2007-10-19 23:54:3716楼 得分:3
之所以想到这个题目,因为曾经有一个小说网站,用flashget批量下载它的小说页面之后全都被保存成了asp的文件,用ie一打开都显示的是html源码,只有在看每一章之前手动把扩展名改成html才正常显示。真的很烦。当时费了九牛二虎之力也没有找到简单的办法(当时还没接触linux),windowsxp图形界面根本满足不了这种需求。
所以这件事给我印象颇深,图形界面在有些时候也不是那么好用的,图形与文本各有千秋。
发表于:2007-10-20 15:57:3617楼 得分:0
我他妈的要崩溃了,这个程序我实在是不知道错在哪!

suse10.0,bash,
#!/bin/bash

mypath="test/"
myfiles="`ls   $mypath   ¦   grep   '^[^\.]'`"
echo   $myfiles

newname=1
sufix=".mp3"

for   onename   in   "$myfiles"
do
        echo   "$onename"
if   [   -f   "$newname$sufix"   ]  
then
        echo   "$newname$sufix   exits"
        newname=$(($newname+1))
        continue
fi
        mv   $mypath$onename   $mypath$newname".mp3"
        newname=$(($newname+1))
done

myfiles="`ls   $mypath`"
echo   "$myfiles"

当前路径下有一个test文件夹,下面有1.mp3     2.mp3     3.mp3     d这四个文件
输出结果是
1.mp3   2.mp3   3.mp3   d
1.mp3
2.mp3
3.mp3
d
mv:   target   `test/1.mp3'   is   not   a   directory
1.mp3   2.mp3   3.mp3   d
也就是说if和fi中间的语句没有执行,这是为什么啊,万能的祌啊,救救我吧
ps:   newname=$(($newname+1))这个可能有问题,我的目的就是newname自增一,我不知道`expr   $newname+1`为什么使newname变成了1+1,而不是2

发表于:2007-10-20 16:33:3818楼 得分:3
expr   $newname   +   1   三个参数中间都应有空格。
for   onename   in   "$myfiles"
应该写成for   onename   in   $myfiles
否则"$myfiles"会被当成整体。

不知道哪里出错的bash程序可以用命令
bash   -x   scriptfilename   options
调试。
发表于:2007-10-20 16:41:3219楼 得分:3
if   [   -f   "$newname$sufix"   ]
该是   if   [   -f   "$mypath/$newname$sufix"   ]
发表于:2007-10-20 16:59:4320楼 得分:0
好,我回去试下
发表于:2007-10-23 10:52:2621楼 得分:3
lz可以结帖了。


快速检索

最新资讯
热门点击