2013-07-15 6 views
3

У меня есть много файлов (изображения), как это (имена файлов состоят только из цифр):Переименование файлов на основе символов в имени

123456.jpg 
369258.jpg 
987123.jpg 
... 

Мне нужно сделать копию каждого в какой-либо другой папке (назовем его выход) и переименовать каждый из файла на основе цифр в названии, что-то вроде этого (в псевдокоде):

outputFileName = String(filename[0]) + String(filename[1]) + String(filename[2]+filename[3]) + ".jpg" 

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

Мне нужно сделать сценарий для массового переименования всех * .jpg в папке, где я поместил скрипт на основе аналогичного алгоритма, и вывести их переименованные в вывод папку, о которой я упоминал ранее.

Этот скрипт должен быть работоспособным с терминала MacOS и окон через оболочку cygwin.

+1

Даже * спецификации * не ясно! – devnull

+0

Вопросы должны ** демонстрировать минимальное понимание решаемой проблемы **. Расскажите, что вы пытались сделать, почему это не сработало и как оно должно работать. См. Также: [Контрольный список вопросов переполнения стека] (http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist) – devnull

+0

не могли бы вы уточнить, что остается неясным? – Astro

ответ

4

Я предполагаю, что основные проблемы : как получить особый характер переменной bash и как выполнить добавление в bash.

  1. Для получения полукокса из Баш переменной, которую вы можете использовать эту форму: ${var:START_INDEX:LENGTH}.

  2. Чтобы выполнить сложение: $((ARG1 + ARG2))

Ваш полученный сценарий может быть таким:

#!/bin/bash 

for f in *.jpg 
do 
    output=${f:0:1}${f:1:1}$((${f:2:1} + ${f:3:1})).jpg 
    mv -- "$f" "$output" 
done 
+0

Большое спасибо! – Astro

3

Вы ищете substring extraction.

Синтаксис: ${string:position:length}, где string - это имя переменной, позиция - это начальная позиция (0 - первый индекс), а length - длина подстроки.

Скрипт, который будет создавать имена файлов, как указано в вопросе, и скопировать их в папку с именем «вход» в папку с именем «выход» может выглядеть следующим образом:

#!/bin/bash 
for file in input/*.jpg 
do 
    filename="$(basename "$file")" 
    firstChar="${filename:0:1}" 
    secondChar="${filename:1:1}" 
    thirdAndFourthChar="$((${filename:2:1} + ${filename:3:1}))" 
    newfilename="$firstChar$secondChar$thirdAndFourthChar.jpg" 
    cp "$file" "output/$newfilename" 
done 
+0

Спасибо вам большое! – Astro