LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1060|回复: 7

这个批量更改文件扩展名的例子为什么执行不了?

[复制链接]
发表于 2004-7-24 10:54:50 | 显示全部楼层 |阅读模式
#!/bin/sh
#filename"sajjpg"
FILES=`ls /root/sysdata1/*.saj`
  for saj in $FILES ;do
  jpg=`echo $saj | sed "s/.saj/.jpg/"`
  mv $saj  $jpg
  done
-------------------------------------------------------
根据精华篇中的"BASH实例教程"改的,结果chmod +x sajjpg后执行,错误信息如下:
[root@zj21cn root]# sh sajjpg
sajjpg: sajjpg: cannot execute binary file
[root@zj21cn root]#
执行ls /root/sysdata1/*.saj,错误信息如下:
[root@zj21cn root]# ls /root/sysdata1/*.saj
bash: /bin/ls: Argument list too long
[root@zj21cn root]#
直接在/root/sysdata1执行ls,完全正常.
为什么呢?我的/sysdata1下有5000个saj文件.
发表于 2004-7-24 14:11:43 | 显示全部楼层
ls不能带那么长的参数
试试
for saj in /root/sysdata1/*.saj; do
行不行
发表于 2004-7-24 14:12:18 | 显示全部楼层
不知道原因,
上面的脚本在我这里可以成功。
发表于 2004-7-24 16:55:48 | 显示全部楼层
try it ;)

  1. #!/bin/bash
  2. cd /root/sysdata1
  3. for saj in *.saj;do
  4. mv $saj $(echo $saj|sed 's/.saj/.jpg/'
  5. done
复制代码
发表于 2004-7-24 20:45:56 | 显示全部楼层
搞什么?哪有那么复杂!

rename .saj .jpg *
 楼主| 发表于 2004-7-24 20:58:09 | 显示全部楼层
#!/bin/sh
#filename"sajjpg"
cd /root
FILES=`ls sysdata1/*.saj`
for saj in $FILES ;do
jpg=`echo $saj | sed "s/.saj/.jpg/"`
mv $saj $jpg
done

这样就可以了
----------------------------------
但:
[root@zj21cn root]# ls /root/sysdata1/*.saj
bash: /bin/ls: Argument list too long
[root@zj21cn root]#
这个好象没什么错误啊
发表于 2004-7-25 10:41:05 | 显示全部楼层
jpg=`echo $saj | sed "s/.saj/.jpg/"`

可以修改一下:
jpg=`echo $saj | sed 's/\.saj$/\.jpg/'`

这样可以避免name.saj.saj的文件名不被改成name.jpg.jpg
 楼主| 发表于 2004-7-25 21:05:11 | 显示全部楼层
不错,更严谨
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表