使用sed和mv重命名文件

时间:2011-04-15 02:27:01

标签: bash sed mv

我想以以下格式重命名文件:

  

img_MM-DD-YY_XX.jpg

     

img_MM-DD-YY_XXX.jpg

为:

  

newyears_YYYY-MM-DD_XXX.jpg

其中:

  • YYYY =年
  • MM =月
  • DD =天
  • XXX或XX =照片编号

我想出了这个脚本,但它无法正常工作:

for filename in ?*.jpg; do
        newFilename=$(echo $filename | \
        sed 's/img_\(.*\)-\(.*\)-\(.*\)_\([0-9][0-9]\)\./newyears_20\3-\1-\2_0\4./;
                s/img_\(.*\)-\(.*\)-\(.*\)_\([0-9][0-9][0-9]\)/newyears_20\3-\1-\2_\4/' -)
        mv $filename $newFilename
done

非常感谢任何帮助。

7 个答案:

答案 0 :(得分:10)

您可以在bash中尝试此脚本:

for filename in *.jpg; do
  newFilename=$(sed -E 's#img_([0-9]{1,2})-([0-9]{1,2})-([0-9]{1,2})_(.*)$#newyears_20\3-\2-\1_\4#' <<< "$filename")
  mv "$filename" "$newFilename"
done
sed -E也支持

gnu sed

答案 1 :(得分:2)

没有for循环。

ls | grep 'jpg$' | sed '
#Save the original filename
h
#Do the replacement
s/img_\(.*\)-\(.*\)-\(.*\)_\([0-9][0-9]\)\./newyears_20\3-\1-\2_0\4.//
s/img_\(.*\)-\(.*\)-\(.*\)_\([0-9][0-9][0-9]\)/newyears_20\3-\1-\2_\4//
#Bring the original filename back
x
G
s/^\(.*\)\n\(.*\)$/mv "\1" "\2"' | bash

在mv

之前点击bash以查看结果

感谢http://www.gnu.org/software/sed/manual/sed.html#Rename-files-to-lower-case

答案 2 :(得分:1)

for f in *.jpg; do
  mv $f $(echo newyears_${f#img_} | sed 's/_\(..\)\.jpg/_0\1.jpg/')
done

答案 3 :(得分:0)

我记得搞过这种事情。我发现创建一个你执行的脚本通常很有用:

即。您的脚本输出将是一个文件:

mv   file1 file2
mv   file3 file4
.....
mv   fileN fileM

要创建它,只需执行ls | grep 日期模式 | sed 脚本将mv file1粘贴到file2 &gt;的MyScript

然后执行./myscript

通过这种方式,您可以更好地查看中间输出,以找出问题所在。

答案 4 :(得分:0)

这个微不足道的变体对我有用:

$ cat mapper
for filename in ?*.jpg
do
    newFilename=$(echo $filename | \
    sed -e 's/img_\(.*\)-\(.*\)-\(.*\)_\([0-9][0-9]\)\./newyears_20\3-\1-\2_0\4./' \
        -e 's/img_\(.*\)-\(.*\)-\(.*\)_\([0-9][0-9][0-9]\)/newyears_20\3-\1-\2_\4/')
    echo mv $filename $newFilename
done
$ echo > img_04-23-09_123.jpg
$ echo > img_08-13-08_33.jpg
$ sh mapper
mv img_04-23-09_123.jpg newyears_2009-04-23_123.jpg
mv img_08-13-08_33.jpg newyears_2008-08-13_033.jpg
$

唯一的区别是使用显式-e选项代替分号。

在MacOS X 10.6.7上测试。

答案 5 :(得分:0)

它可以由纯粹的bash脚本处理。

for j in ?*.jpg
do
  n="newyears_20${j:10:2}-${j:4:2}-${j:7:2}";
  if [ ${j:15:1} = "." ];then
    n="${n}_0${j:13}"
  else
    n="${n}${j:12}"
  fi
  mv $j $n
done

答案 6 :(得分:0)

红宝石(1.9 +)

$ ruby -e 'Dir["img*jpg"].each{|x|File.rename(x,x.gsub(/img_(.*?)-(.*?)-(.*?)\.jpg/,"newyears_20\\2-\\1-\\3.jpg") )}'