当前位置: 技术问答>linux和unix
求一个批量重命名文件的shell程序
来源: 互联网 发布时间:2016-02-15
本文导语: 有一个文件夹,下面有100个文件,我想以1~100来命名这100文件,如何实现? | A=1; for i in *; do echo $i; mv $i $A; A=`expr $A + 1`; done | [code=BatchFile]~/bin/junk>A=1; for i in *; do echo $i;...
有一个文件夹,下面有100个文件,我想以1~100来命名这100文件,如何实现?
|
A=1; for i in *; do echo $i; mv $i $A; A=`expr $A + 1`; done
|
[code=BatchFile]~/bin/junk>A=1; for i in *; do echo $i; mv $i $A; A=`expr $A + 1 `; done[/code]
~/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
~/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
|
如果你使用的是windows XP操作系统的话,要想批量重命名就很简单了。第一步:首先按自己的希望调整好文件顺序。第二步:全选所有文件,在第一个文件上击右键,重命名该文件(注意不要修改扩展名),如改为“tu(1).jpg”(注意:tu后面的括号和数字一定要在英文状态下输入),然后按回车,等一会就会全部重命名完毕。第一个文件为tu(1).jpg,第二个为tu(2).jpg,第三个为tu(3).jpg……以此类推。用这种方法同样可以批量重命名文件夹。
|
directory=test2/
num=1
ls $directory|while read name
do
mv $directory$name $directory$num
num=` expr $num + 1 `
done
num=1
ls $directory|while read name
do
mv $directory$name $directory$num
num=` expr $num + 1 `
done
|
#!/bin/bash
mydir=~/tmpdir/
num=1
for i in `ls ~/tmpdir`
do
mv $mydir$i $mydir$num
num=`expr $num + 1`
done
mydir=~/tmpdir/
num=1
for i in `ls ~/tmpdir`
do
mv $mydir$i $mydir$num
num=`expr $num + 1`
done
|
上面很多人都给出答案了。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批量重命名能满足这些特殊要求吗?
因为如果目录名不以'/'结尾那么$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批量重命名能满足这些特殊要求吗?
|
to tpfly, 一个可考虑的方法:
cd /home/name/doc && for i in *asp;do mv $i `echo $i | sed 's/.asp/.html/g'`;done
不过如果文件名很复杂,如有a.asp.asp或者其他方式则需要加额外处理
cd /home/name/doc && for i in *asp;do mv $i `echo $i | sed 's/.asp/.html/g'`;done
不过如果文件名很复杂,如有a.asp.asp或者其他方式则需要加额外处理
|
嗯,sed是个不错的思路。
如果a.asp.asp我想可以用正则表达式
看来这可能是最简单的做法了。
如果a.asp.asp我想可以用正则表达式
看来这可能是最简单的做法了。
|
cd /home/name/doc && for i in *asp;do mv $i `echo $i ¦ sed 's#asp$#html#g '`;done
可能这样稍微好一些,这样只会匹配最后的那个asp,就是文件名中间有.asp也不会出错了
可能这样稍微好一些,这样只会匹配最后的那个asp,就是文件名中间有.asp也不会出错了
|
顶,我支持acange的解决方法,是UNIX下的方法,也是最简洁的方法。
|
http://topic.csdn.net/u/20070330/07/182c8cdf-4471-4953-9ad7-733555f4e8fc.html
不太相干,但也是shell
不太相干,但也是shell
|
*不能匹配隐藏文件如 .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,@表示空扩展名,即可以添加或去掉扩展名。
如果目录里没有匹配文件那么通配符只能保持原样。例如,如果目录里没有以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,@表示空扩展名,即可以添加或去掉扩展名。
|
之所以想到这个题目,因为曾经有一个小说网站,用flashget批量下载它的小说页面之后全都被保存成了asp的文件,用ie一打开都显示的是html源码,只有在看每一章之前手动把扩展名改成html才正常显示。真的很烦。当时费了九牛二虎之力也没有找到简单的办法(当时还没接触linux),windowsXP图形界面根本满足不了这种需求。
所以这件事给我印象颇深,图形界面在有些时候也不是那么好用的,图形与文本各有千秋。
所以这件事给我印象颇深,图形界面在有些时候也不是那么好用的,图形与文本各有千秋。
|
expr $NEWNAME + 1 三个参数中间都应有空格。
for ONENAME in "$MYFILES"
应该写成for ONENAME in $MYFILES
否则"$MYFILES"会被当成整体。
不知道哪里出错的BASH程序可以用命令
bash -x scriptfilename options
调试。
for ONENAME in "$MYFILES"
应该写成for ONENAME in $MYFILES
否则"$MYFILES"会被当成整体。
不知道哪里出错的BASH程序可以用命令
bash -x scriptfilename options
调试。
|
if [ -f "$NEWNAME$SUFIX" ]
该是 if [ -f "$MYPATH/$NEWNAME$SUFIX" ]
该是 if [ -f "$MYPATH/$NEWNAME$SUFIX" ]
|
lz可以结帖了。
|
SF