2017-02-21 37 views
0

Мои фотографии хранятся в папке с картинками даты имя папки, например, оригинальные пути и имена файлов:Как я могу переименовать несколько изображений с именами путей и переупорядоченными последовательностями в bash?

.../Pics/2016_11_13/wedding/DSC0215.jpg 
.../Pics/2016_11_13/afterparty/DSC0234.jpg 
.../Pics/2016_11_13/afterparty/DSC0322.jpg 

Как переименовать фотографии в формате ниже, с непрерывными последовательностями и 4 -digit padding?

.../Pics/2016_11_13_wedding.0001.jpg 
.../Pics/2016_11_13_afterparty.0002.jpg 
.../Pics/2016_11_13_afterparty.0003.jpg 

Я использую Bash 4.1, поэтому доступна только команда mv. Вот что у меня есть сейчас, но это не работает

#!/bin/bash 

p=0 
for i in *.jpg; 
do 
    mv "$i" "$dirname.%03d$p.JPG" 
    ((p++)) 
done 

exit 0 
+0

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

+1

Вы написали какой-нибудь код? – codeforester

+0

искать здесь для '[linux] найти xargs mv printf'. Вы должны найти много примеров, которые помогут вам решить вашу проблему. Вам нужно использовать '% 04d' внутри программы, которая знает, как оценить это место (' printf'). и вам нужно взять вывод команды и подставить ее в свою реальную команду (cmd-подзаголовок) с помощью '$ (printf ....)'. Удачи. – shellter

ответ

1

Пусть у вас есть что-то вроде .../Pics/2016_11_13/свадьба/XXXXXX.jpg; затем зайдите в каталог .../Pics/2016_11_13; оттуда вы должны иметь кучу подкаталогов, таких как свадьба, afterparty и т. д. Запустите этот скрипт (отказ от ответственности: я не проверял):

#!/bin/sh 
for subdir in *; do    # scan directory 
    [ ! -d "$subdir" ] && continue; # skip non-directory 
    prognum=0;      # progressive number 
    for file in $(ls "$dir"); do  # scan subdirectory 
    ((prognum=$prognum+1))   # increment progressive 
    newname=$(printf %4.4d $prognum) # format it 
    newname="$subdir.$newname.jpg" # compose the new name 
    if [ -f "$newname" ]; then  # check to not overwrite anything 
     echo "error: $newname already exist." 
     exit 
    fi 

    # do the job, move or copy 
    cp "$subdir/$file" "$newname" 

    done 
done 

Пожалуйста, обратите внимание, что я пропустил «дата» (2016_11_13) часть - Я не уверен в этом. Если у вас есть одна дата, то легко добавить эти цифры в # скомпоновать новое имя. Если у вас несколько дат, вы можете добавить вложенные for для сканирования каталогов «даты». Еще одна причина, почему я пропустил это, это позволит вам развивать что-то сами, что вы можете гордиться ...

0

Использование только mv и Баш встроенных команд:

#! /bin/bash 

shopt -s globstar 
cd Pics 
p=1 
# recursive glob for .jpg files 
for i in **/*.jpg 
do 
    # (date)/(event)/(filename).jpg 
    if [[ $i =~ (.*)/(.*)/(.*).jpg ]] 
    then 
     newname=$(printf "%s_%s.%04d.jpg" "${BASH_REMATCH[@]:1:2}" "$p") 
     echo mv "$i" "$newname" 
     ((p++)) 
    fi 
done 

globstar особенность Баш 4,0, и регулярное совпадение доступно даже в bash OSX's anitque.