按日期将图像排序到子目录中

按日期将图像排序到子目录中

我有一个包含图像的子目录的目录。我想创建一个新目录并将所有图像移到其中,然后按year/month/day修改顺序将它们排序到子目录中。

我想到使用findmv将所有图像移动到新目录,找到目录中第一个图像的日期,创建一个以该图像年份命名的子目录,然后查找并移动该目录中具有相同年份的所有图像我将对主目录中的每个图像执行此操作,然后我将在每个子目录中重复该过程一个月,然后一天。

我的问题是我相信必须有一种更排序的方法来做到这一点。

有任何想法吗?

答案1

zsh

zmodload zsh/files # bring in builtin versions of mkdir and mv to speed things up
zmodload zsh/stat

for file (**/*.jpg(N.)) {
   zstat -F %Y/%m/%d -A date +mtime -- $file &&
     mkdir -p $date &&
     mv -- $file $date
}

如果您没有zsh并且无法安装它,则可以使用 GNU 工具最大程度地减少运行命令的数量:

(export LC_ALL=C
  find . -name '*.jpg' -type f -printf '%TY/%Tm/%Td\0%p\0' |
    gawk -v 'RS=\0' -v q="'" '
      function shquote(s) {
        gsub(q, q "\\" q q, s)
        return q s q
      }
      {
        date = $0; getline file
        dir[date] = dir[date] " " shquote(file)
      }
      END {
        printf "mkdir -p ."
        for (d in dir) printf " %s", d
        print " || exit"
        for (d in dir) print "mv" dir[d], d
      }' | sh
)

(您可能需要| sh首先删除以检查它是否符合您的要求)。

请注意,这些都不能防止冲突。例如,如果您有 aa/foo.jpgb/foo.jpg两者的最后修改时间都是 2017-11-01,那么它们都将被移动到2017/11/01/foo.jpg,其中一个会覆盖另一个。您可能需要添加-i标志来mv防范它。

相关内容