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

我怎样才能达到我想要的结果,而不必在我的图片文件夹中的每个目录上单独运行它?

4

4 回答 4

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
于 2013-04-05T21:25:54.150 回答
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

更改您的图片文件夹的位置,并首先使用回声进行试运行。这就是你想要的……?

于 2013-04-06T08:31:36.687 回答
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。

于 2013-04-05T20:59:35.203 回答
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

这是漫长而乏味的,并不理想,但它确实有效。多年来,当我遇到它们时要对它们进行分类和添加图片时,可以接受一个更短的解决方案。

于 2013-04-06T05:03:42.173 回答