Переименуйте файлы, используя sed и mv - PullRequest
6 голосов
/ 15 апреля 2011

Я хочу переименовать файлы в формате:

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 ]

10 голосов
/ 15 апреля 2011

Вы можете попробовать этот скрипт в 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.

3 голосов
/ 28 февраля 2014

Без цикла 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

Ommit трубопроводов в bash, чтобы увидеть результаты до mv

Благодаря http://www.gnu.org/software/sed/manual/sed.html#Rename-files-to-lower-case

1 голос
/ 15 апреля 2011
for f in *.jpg; do
  mv $f $(echo newyears_${f#img_} | sed 's/_\(..\)\.jpg/_0\1.jpg/')
done
0 голосов
/ 15 апреля 2011

Рубин (1,9 +)

$ ruby -e 'Dir["img*jpg"].each{|x|File.rename(x,x.gsub(/img_(.*?)-(.*?)-(.*?)\.jpg/,"newyears_20\\2-\\1-\\3.jpg") )}'
0 голосов
/ 15 апреля 2011

Это может быть обработано чисто 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
0 голосов
/ 15 апреля 2011

Этот тривиальный вариант у меня работает:

$ 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.

0 голосов
/ 15 апреля 2011

Я помню, как возился с такими вещами.Мне часто бывает полезно создать скрипт, который вы выполняете, чтобы делать то, что вы хотите:

т.е.вывод вашего скрипта будет выглядеть так:

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

Чтобы создать это, просто выполните команду ls |grep шаблон даты |Sed сценарий для прикрепления mv file1 к file2 > myscript

, затем просто выполните ./myscript

Таким образом, вы лучше посмотрите на промежуточный вывод, чтобы выяснить, что происходитнеправильно.

...