2013-04-05 3 views
1

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

Pictures- 
    Vacation- 
     img.001.jpg              
     img.002.jpg             
     img.003.jpg              
    Holidays- 
     img.004.jpg 
     img.005.jpg              
     img.006.jpg             
    Fun- 
     img.007.jpg 

То, что я хотел бы достичь, это:

Pictures-                 
    Vacation- 
     img.001.jpg 
     img.002.jpg 
     img.003.jpg 
    Holidays- 
     img.001.jpg 
     img.002.jpg 
     img.003.jpg 
    Fun- 
     img.001.jpg 

До сих пор я придумал следующее:

a=1 
for i in $vm/Holiday/*; do 
    new=$(printf "%03d.jpg" ${a}) 
    mv ${i} $vm/Holiday/${new} 
    let a=a+1 
done 

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

+0

Не могли бы вы опубликовать код того, что вы пробовали? –

+0

Не знаете, почему вы отметили это с помощью 'iphone', но я исправил его. –

ответ

1

Возьмите свою версию и сделайте ее итерацией по папкам.

#!/bin/bash 

for dir in ~/code/stack/Pictures/*; do 
     [ -d "${dir}" ] || continue 
     i=1 
     for img in "${dir}"/*.jpg; do 
       [ -e "${img}" ] || break 
       new="$(printf "%03d.jpg" "${i}")" 
       echo mv "${img}" "$(dirname "${img}")/${new}" 
       ((i++)) 
     done 
done 

Сначала измените местоположение папки «Фотографии» и «сухой» с помощью эха. Это то, что ты хотел ...?

+1

Спасибо. Это именно то, что мне нужно, и достаточно логично понять. Работает отлично. – Chilly

0
#!/bin/bash 

function renameImages { 
    local i=1; 
    for oldFile in * ; do 
     if [ -d "$oldFile" ] ; then 
      pushd "$oldFile" >/dev/null 
      renameImages 
      popd >/dev/null 
     elif [ "${oldFile##*.}" == "jpg" ] ; then 
      newFile=$(printf img.%03d.jpg $i) 
      echo "$PWD/$oldFile -> $PWD/$newFile" 
      i=$((i+1)) 
     fi 
    done 
} 

renameImages 

Это фактически не будет переименовывать какие-либо файлы, но вместо этого он будет печатать на экране, как это будет.

Если вы довольны тем, что он делает, изменить

echo "$PWD/$oldFile -> $PWD/$newFile" 

к

mv "$PWD/$oldFile" "$PWD/$newFile" 

Примечание: первого редактирования этого ответа будет переименовать все файлы, .jpg или нет. Эта версия только переименовывает .jpg.

+0

Это почти дает желаемый результат, но приводит к бесконечному циклу и ловит несколько других папок .. Я буду играть с ним. – Chilly

1

попробовать это

ls > folders  #cat top folders into folders 
while read folder 
    do 
    cd $folder   #go to vacation folder for example 
    i=0 
    ls *.jpg > files 
    while read line 
     do 
     mv $line img.$i.jpg #rename files according to your need 
     i=$(($i+1)) 
     done < "files" 
    rm files 
    cd .. 
    done < "folders" 
rm folders 
0
#!/bin/bash 

a=1 
for i in $vm/Vacation/*; do 
new=$(printf "%04d.jpg" ${a}) 
mv ${i} $vm/Vacation/${new} 
let a=a+1 
done 

b=1 
for i in $vm/Holiday/*; do 
new=$(printf "%04d.jpg" ${b}) 
mv ${i} $vm/Holiday/${new} 
let b=b+1 
done 

c=1 
for i in $vm/Fun/*; do 
new=$(printf "%04d.jpg" ${c}) 
mv ${i} $vm/Fun/${new} 
let c=c+1 
done 

Это долго и утомительно, не идеальна, но она работает. С годами папок для сортировки и добавления фотографий, когда я сталкивался с ними, было бы принято гораздо более короткое решение.