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

Wag*_*ags 5 scripting shell-script date

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

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

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

jof*_*fel 3

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

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

d=$(date -r "$x" +%Y-%m-%d)
Run Code Online (Sandbox Code Playgroud)

和

d="${x:4:4}-${x:8:2}-${x:10:2}"
Run Code Online (Sandbox Code Playgroud)

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

d=$(expr substr "$x" 5 4)-$(expr substr "$x" 9 2)-$(expr substr "$x" 11 2)
Run Code Online (Sandbox Code Playgroud)

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

sed解决方案:

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

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

使用awk解决方案:

d=$(echo "$x" | awk -F _ '{print $2}')
Run Code Online (Sandbox Code Playgroud)

剪切解决方案:

d=$(echo "$x" | cut -d_ -f 2')
Run Code Online (Sandbox Code Playgroud)