【问题标题】:Rename files numerically in place, multiple folders以数字方式重命名文件,多个文件夹
【发布时间】:2013-04-05 20:38:17
【问题描述】:

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

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

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

【问题讨论】:

  • 你能发布一些你尝试过的代码吗?
  • 不知道你为什么用iphone标记这个,但我已经修复了。

标签: bash shell unix


【解决方案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】:

试试这个

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

【讨论】:

    【解决方案3】:
    #!/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。

    【讨论】:

    • 这几乎产生了预期的结果,但会导致无限循环并捕获其他一些文件夹。我会玩它的。
    【解决方案4】:
    #!/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
    

    这是漫长而乏味的,并不理想,但它确实有效。由于我遇到了多年的文件夹来排序和添加图片,因此可以接受一个更短的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-05
      • 2019-07-23
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      相关资源
      最近更新 更多