首页 > 解决方案 > Bash 重命名文件以附加文件夹名称

问题描述

在文件夹和子文件夹中,我有一堆按日期命名的图像。我正在尝试编写一个脚本来查看文件夹/子文件夹并重命名所有 jpg 文件以添加文件夹名称。

例子:

/桌面/旅行 1/200512 1.jpg

/桌面/旅行 1/200512 2.jpg

会变成:

/桌面/Trip 1/Trip 1 200512 1.jpg

/桌面/Trip 1/Trip 1 200512 2.jpg

我尝试调整这个脚本,但我不知道如何让它添加新部分。我也不知道如何让它在子文件夹上工作。

#!/bin/bash
# Ignore case, i.e. process *.JPG and *.jpg
shopt -s nocaseglob
shopt -s nullglob

cd ~/Desktop/t/

# Get last part of directory name
here=$(pwd)
dir=${here/*\//}
i=1
for image in *.JPG 
do
   echo mv "$image" "${dir}${name}.jpg"
   ((i++))
done

标签: bashmacosrenamefinder

解决方案


使用不区分大小写的匹配选项和循环图像的小脚本find-iname

find /Desktop -iname '*.jpg' -exec sh -c '
  for img; do
    parentdir=${img%/*}      # leave the parent dir (remove the last `/` and filename)
    dirname=${parentdir##*/} # leave the parent directory name (remove all parent paths `*/`)
    echo mv -i "$img" "$parentdir/$dirname ${img##*/}"
  done
' sh {} +

这会提取每个图像路径的父路径(如dirname命令)和目录名称(如basename),并在图像文件名之前使用父目录名称构造一个新的输出文件名。

echo如果输出看起来符合预期,请删除。


推荐阅读