使用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
任何帮助将不胜感激。     
已邀请:
您可以在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
gnu sed
也支持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之前查看结果 感谢http://www.gnu.org/software/sed/manual/sed.html#Rename-files-to-lower-case     
for f in *.jpg; do
  mv $f $(echo newyears_${f#img_} | sed \'s/_\\(..\\)\\.jpg/_0\\1.jpg/\')
done
    
我记得搞这种事情。我发现创建脚本以执行所需的操作通常很有用: 即。脚本的输出将是一个类似以下的文件:
mv   file1 file2
mv   file3 file4
.....
mv   fileN fileM
要创建此文件,只需执行ls | grep日期格式| sed脚本将mv file1粘贴到file2> myscript 然后执行./myscript 这样,您可以更好地查看中间输出以找出问题所在。     
这个琐碎的变体对我有用:
$ 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
$
唯一的区别是使用显式的“ 8”选项代替分号。 在MacOS X 10.6.7上测试。     
它可以由纯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
    
红宝石(1.9+)
$ ruby -e \'Dir[\"img*jpg\"].each{|x|File.rename(x,x.gsub(/img_(.*?)-(.*?)-(.*?)\\.jpg/,\"newyears_20\\\\2-\\\\1-\\\\3.jpg\") )}\'
    

要回复问题请先登录注册