创建子目录并根据文件名按日期组织文件

创建子目录并根据文件名按日期组织文件

我一直在使用以下脚本将我的照片组织到“日期”目录中:

for x in *.JPG; do
  d=$(date -r "$x" +%Y-%m-%d)
  mkdir -p "$d"
  mv -- "$x" "$d/"
done

这个脚本效果很好。我的照片文件遵循相同的命名约定“IMG_20131125_090000.JPG”,即拍摄照片的日期和时间。有没有办法更改上面的脚本,使其仍然分类到日期目录中,但使用文件名中的日期而不是使用文件修改的日期?

答案1

答案已修复为 2013-11-25 而不是 20131125

如果您的脚本使用bash兼容的 shell 运行,最简单的解决方案是替换

d=$(date -r "$x" +%Y-%m-%d)

d="${x:4:4}-${x:8:2}-${x:10:2}"

带有 expr 的便携式解决方案:

d=$(expr substr "$x" 5 4)-$(expr substr "$x" 9 2)-$(expr substr "$x" 11 2)

如果您只需要 20131125 而不是 2013-11-25 作为目录名称,您也可以

sed解决方案:

d=$(echo "$x" | sed 's/.*_\([0-9]*\)_.*/\1/')

这些sed命令将文件名替换为下划线之间的数字(=日期)。

使用awk解决方案:

d=$(echo "$x" | awk -F _ '{print $2}')

带剪切的解决方案:

d=$(echo "$x" | cut -d_ -f 2')

答案2

您可以使用 :

export LC_ALL=C
for x in *.JPG; do
  d=$(date -d $( cut -d"_" -f2 <<< ${x} ) +%Y-%m-%d )
  mkdir -p "$d"
  mv -- "$x" "$d/"
done

相关内容