用于将文件重命名为多个目录中的连续数字的Bash脚本

时间:2014-04-05 11:56:27

标签: bash batch-rename

我有这样的目录结构:

AD
 -> AD01
   -> DSC123.jpg
   -> DSC124.jpg
 -> AD02
   -> DSC234.jpg
   -> DSC1455.jpg
 -> AD03
  ->...
 -> AD04
  ->...
 ->...
AE
 ->...
...

不,我想运行一个遍历整个树的脚本,并将每个文件夹文件重命名为连续的数字01.jpg,02.jpg ......等。

我找到了这样的东西来帮助连续数字:

find -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv %s %02d.jpg\n", $0, a++ }' | bash 

但是如何让它在整个树中以递归方式运行所有文件夹(每个文件夹有1000个,每个文件夹大约有6-20个文件)。

编辑: 结果应如下所示:

AD
 -> AD01
   -> 01.jpg
   -> 02.jpg
 -> AD02
   -> 01.jpg
   -> 02.jpg
 -> AD03
  ->...
 -> AD04
  ->...
 ->...
AE
 ->...
...

4 个答案:

答案 0 :(得分:1)

您可以尝试使用此bash脚本

#!/bin/bash
for dir in $(find -type d \( ! -name '.*' \)) 
do 
  i=1; 
  for file in $(find "$dir" -name '*.png')
  do 
     a=$(printf "%02d" $i)
     new=${file%/*}
     echo "mv $file $new/$a.png"
     let i=i+1
  done 
done

它将列出要应用的mv命令。看看它是否给出了你的期望。最后,将echo替换为mv命令。

答案 1 :(得分:1)

使用的最短的一个:

cd AD/AD02
rename -n 'no strict; s@.*(?=\.)@sprintf "%0.2d", ++$x@e' *.jpg

当输出看起来不错时,请移除-n开关。

warning 有些其他具有相同名称的工具可能无法执行此操作,因此请小心。

util-linux软件包中的重命名命令不会。

如果运行以下命令(GNU

$ file "$(readlink -f "$(type -p rename)")"

并且您得到的结果包含Perl script, ASCII text executable而不包含ELF,那么这似乎是正确的工具=)

如果没有,则将其设置为DebianUbuntu之类的派生类的默认设置(通常已经是这样):

$ sudo apt install rename
$ sudo update-alternatives --set rename /usr/bin/file-rename

如果您没有此发行版的其他命令,请搜索软件包管理器以进行安装或do it manually(无部门...)


此工具最初由Perl的父亲Larry Wall编写。

答案 2 :(得分:0)

#!/bin/bash
files=$(find . -name "*.jpg" -type f)
a=1
for i in $files; do
  dir=$(dirname "$i")
  new=$(printf "%04d" ${a}) 
  mv ${i} $dir/${new}.jpg
  let a=a+1
done

答案 3 :(得分:0)

使用find查找目录,然后依次cd进每个目录并重命名文件。

find /path/to/catalogue -type d -exec bash -c '
  shopt -s nullglob
  for dir in "$@" ; do
    ( cd "$dir" || exit
      files=( *[!0-9]*.jpg )
      for (( n = 0 ; n < "${#files[@]}" ; n++ )) ; do
        printf -v target '%02d.jpg' $(( n + 1 ))
        mv -- "${files[$n]}" "$target"
      done )
  done
' bash {} +