2013-04-05 91 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

你能发表一些你试过的代码吗? – 2013-04-05 20:40:15

+0

不知道你为什么用'iphone'标记这个,但我修复了它。 – 2013-04-05 20:47:00

回答

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 2013-04-06 14:42:19

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。

+0

这几乎产生所需的结果,但导致无尽的循环,并捕获其他一些文件夹..我会玩它。 – Chilly 2013-04-05 21:37:59

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 

这是漫长而乏味的,不是很理想,但它的作品。使用多年的文件夹进行排序和添加图片,当我遇到他们时,一个更短的解决方案将被接受。