如何使用 bash 脚本替换多个目录中的文件名?

如何使用 bash 脚本替换多个目录中的文件名?

我有多个目录,每个目录包含多个文件:

folder1
   file1.jpg
   file2.jpg
   file3.jpg
folder2
   file1.jpg
   file2.jpg
   file3.jpg

我想像这样替换:

folder1
   0001.jpg
   0002.jpg
   0003.jpg
folder2
   0001.jpg
   0002.jpg
   0003.jpg

我的 bash 脚本...

start_dir="/path/to/folder/"
find "$start_dir" -name '*.jpg' -type f \
  |sort \
  |while read name; do 
     ((i++))
     mv -i "$name" \
       "$(printf '%s/%04u%s' "$(dirname "$name")" $((i)) "$(basename ".jpg")")"
   done

这样做:

folder1
   0001.jpg
   0002.jpg
   0003.jpg
folder2
   0004.jpg
   0005.jpg
   0005.jpg

如何获取该文件替换开头为0001每个文件夹中都有 .jpg 吗?

答案1

在循环中分别处理每个子目录

start_dir="/tmp/start/"

find "$start_dir" -name '*' -type d \
  |sort \
  |while read folder; do

i=0
find "$folder"  -maxdepth 1  -name '*.jpg' -type f \
  |sort \
  |while read name; do 
     ((i++))
     mv -i "$name" \
       "$(printf '%s/%04u%s' "$(dirname "$name")" $((i)) "$(basename ".jpg")")"
   done

done

 ls -R
.:
fold1  fold2

./fold1:
43.jpg  aa.jpg  a.jpg

./fold2:
ba.jpg  bb.jpg  wbb.jpg

ls -R
.:
fold1  fold2

./fold1:
0001.jpg  0002.jpg  0003.jpg

./fold2:
0001.jpg  0002.jpg  0003.jpg

工作时不会发生碰撞

答案2

尝试这样做,而不是((i++))

if [[ $tmpdir == $(dirname $name) ]] ; then
 i=i+1;
else
  i=0;
fi
tmpdir=$(dirname $name)

相关内容