首页 > 解决方案 > 尝试使用 bash 中的捕获组重命名文件

问题描述

我在 yyyy-MM-dd/img.jpg 格式的文件夹中有一堆来自谷歌外卖的图像文件 - 我使用 phockup 来组织我的照片,它需要照片位于 yyyy/mm/dd 文件夹中。我想保留日期,因为谷歌已经给了我它们。

例如 - 此文件夹/图像应匹配

/2018-07-01/test_img.jpg

并重命名为

/2018/07/01/test_img.jpg

我曾尝试将 bash 与 sed 一起使用并找到使用正则表达式捕获组来移动文件,但我似乎运气不佳。请参阅下文了解我目前的位置

find . -name "*.jpg" -print0 | sed 'p;s/([0-9]{4})\-([0-9]{2})\-([0-9]{2})\/(.*)/$2\/$3\/$4\/$5/' | xargs -0 -n2 mv

这是我得到的错误

mv: 无法将 './2018-07-01/test_img.jpg' 移动到 ''$'\n''./2018-07-01/test_img.jpg': 没有这样的文件或目录

这似乎很奇怪,因为我认为正则表达式捕获组是正确的。我不确定为什么它不会重命名文件。

标签: regexbash

解决方案


这是一个 bash 的可能性。在具有日期命名目录的目录中运行脚本。我使用了复制命令而不是移动,因此您可以在删除旧文件之前检查结果。如果您想改用 mv,请至少运行一次,并在其前面使用 echo 进行完整性检查。

newdir=/home/me/newpics

[[ -d "$newdir"  ]] || mkdir "$newdir"

for dir in *; do
  if [[ -d "$dir" && "$dir" =~ ([0-9]+)-([0-9]+)-([0-9]+) ]]; then
      year=${BASH_REMATCH[1]}
      month=${BASH_REMATCH[2]}
      day=${BASH_REMATCH[3]}

      todir="$newdir/$year"; [[ -d "$todir"  ]] || mkdir "$todir"
      todir+="/$month";      [[ -d "$todir"  ]] || mkdir "$todir"
      todir+="/$day";        [[ -d "$todir"  ]] || mkdir "$todir"

      for file in "$dir/"*.jpg; do
        base=$(basename "$file")
        cp "$file" "$todir/$base"
      done
  fi
done

推荐阅读