11

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

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

任何帮助将不胜感激。

4

7 回答 7

15

您可以在 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

于 2011-04-15T02:48:38.897 回答
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

省略管道到 bash 以在 mv 之前查看结果

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

于 2014-02-28T18:48:52.640 回答
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
于 2011-04-15T03:07:46.583 回答
0

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

IE。您的脚本的输出将是一个文件,如:

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

要创建它,只需执行 ls | grep 日期模式| sed脚本将 mv file1 粘贴到 file2 > myscript

然后只需执行 ./myscript

这样,您可以更好地查看中间输出以找出问题所在。

于 2011-04-15T02:31:10.887 回答
0

红宝石(1.9+)

$ ruby -e 'Dir["img*jpg"].each{|x|File.rename(x,x.gsub(/img_(.*?)-(.*?)-(.*?)\.jpg/,"newyears_20\\2-\\1-\\3.jpg") )}'
于 2011-04-15T03:22:36.080 回答
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 上测试。

于 2011-04-15T02:46:44.070 回答
-1
for f in *.jpg; do
  n=$(sed -r 's/^(.+)-([^_]+)_(.+)\.jpg/\2-\1_\3.jpg/' <<< "${f#img_}")
  mv "$f" "newyears_20$n"
done

<<<是一个bash称为此处字符串的功能,并从. 表达式通过孤立成、成和成然后形成。请注意,作业中不需要引用。${f#img_}img_$fsedimg_MM-DD-YY_XX.jpgYY-MM-DD_XX.jpgMM-DD\1YY\2XX\3\2-\1_\3.jpgn

为了安全起见,对于这样的事情,我实际上更喜欢使用echo mv而不是mv,所以我可以看到这将生成的命令。然后,您可以将echo输出删除或通过管道传输到sh.

于 2011-04-15T18:30:36.793 回答