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

问题描述 投票:0回答:4

我有这样的目录结构:

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
 ->...
...
bash batch-rename
4个回答
0
投票

您可以尝试此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
投票

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

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 {} +

1
投票

使用的最短的一个:

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

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

“警告”小心。

不属于util-linux软件包的重命名命令。

如果运行以下命令(GNU

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

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

如果没有,将其设为Debian的默认值(通常已经是这种情况),并使其像Ubuntu这样的派生形式:]

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


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


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


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
© www.soinside.com 2019 - 2024. All rights reserved.