以数字方式重命名文件,多个文件夹

时间:2013-04-05 20:38:17

标签: bash shell unix

我可以在多个文件夹中以数字方式重命名文件。但是,这不是我要找的结果。我的文件结构如下:

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

如何在我的图片文件夹中的每个目录上单独运行此结果,如何实现我想要的结果?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

首先使用回声更改“图片”文件夹和干燥运行的位置。这就是你想要的......?

答案 2 :(得分: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。此版本仅重命名.jpgs。

答案 3 :(得分: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

这是漫长而乏味的,并不理想,但它确实有效。使用多年的文件夹来排序和添加图片时,我会接受一个更短的解决方案。