统一修改文件的后缀名

临峰不畏 发布于 2013/12/05 21:46
阅读 691
收藏 2

我的目录下有一些图片文件,都是以大写的JPG为后缀名的。可上传到QQ空间去时,QQ空间只能识别.jpg为后缀名的,大写的识别不了。所以,我想要将所有图片文件的后缀名换成小写的。

for f in $(ls); 
do 
  mv $f ${f/.JPG/.jpg}; 
done
结果出问题了。有部分文件名中间有空格。如"IMG 0054.JPG"

请问这种问题该如何解决?我很关心生成数组时,数组成员中间有空格时应该如何处理。

先谢了!

以下是问题补充:

@临峰不畏:关键的问题是文件名中包含了空格,在`ls`建立数组时,文件名会因空格被拆分成多块。 (2013/12/05 22:42)
加载中
0
临峰不畏
临峰不畏

我今天想到了一个办法,供大家参考:

for f in `ls | sed 's/ /<Space>/' | xargs`; do
  f=${f//<Space>/ };
  mv "$f" "${f/.JPG/.jpg}";
done
主要思想是,先通过ls列出每一个文件名,并用sed命令将文件名中的所有空格符替换成<Space>,这样就可以避开空格符导致的文件名被拆分问题。如“IMG 0054.JPG”被替换成了"IMG<Space>0054.JPG"。再形成一个数组供for循环使用。在for循环中,"f=${f//<Space>/ }"再将<Space>替换回空格符供使用。

0
leo108
leo108
for f in $(ls); 
do 
  mv "$f" "${f/.JPG/.jpg}"; 
done



临峰不畏
临峰不畏
不行,这样还是没有解决根本问题。 在$(ls)中,文件被拆份成了。 for f in IMG 0054.JPG;do echo $f done 文件名被拆分成了两个"IMG", "0054.JPG"
0
长的不行
#!/bin/bash
for img_file in `ls *.JPG`
do
    new_name=$( echo $img_file | sed 's/JPG$/jpg/' )
    echo $new_name
    mv $img_file $new_name

done

works for me on Ubuntu with GNU bash, version 4.2.10, thanks.

临峰不畏
临峰不畏
如果文件名中有空格,你这样是会出问题的。 如"IMG 0054.JPG",在`ls *.JPG`时,一个完整的文件名会被拆成了"IMG"与"0054.JPG",分别给了image_file。
0
NickWilde
NickWilde

UBUNTU下可以试试这个(只做后缀大小写转换)

rename 'y/\.cpp$/\.CPP/' *.cpp


临峰不畏
临峰不畏
你说的也是一种方法。 这里我主要是想问如果文件名中有空格时,如何生成数组。
NickWilde
NickWilde
需要注意的是这个rename是perl版本的。
返回顶部
顶部