日付で画像をサブディレクトリに並べ替える

日付で画像をサブディレクトリに並べ替える

イメージのサブディレクトリを含むディレクトリがあります。新しいディレクトリを作成し、すべてのイメージをそのディレクトリに移動し、変更された順序でyear/month/dayサブディレクトリにソートしたいと思います。

findすべてのイメージを使用して新しいディレクトリに移動しmv、ディレクトリ内の最初のイメージの日付を見つけ、そのイメージの年に沿って名前を付けたサブディレクトリを作成し、そのディレクトリで同じ年のすべてのイメージを見つけて移動しようとしました。私はディレクトリ内の各画像に対して基本的な操作を実行し、各サブディレクトリに対して1ヶ月間、次に1日間プロセスを繰り返します。

私の問題は、これを行うにはもう少し秩序ある方法があるべきだと信じているということです。

どんなアイデアがありますか?

答え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(要件を満たしていることを確認するには、まず削除する必要があります。)

これらのどれも衝突を防ぐことはできません。たとえば、があり、両方とも2017-11-01で最後に変更された場合、両方が移動され、a/foo.jpg一方b/foo.jpg2017/11/01/foo.jpg他方を上書きします。これを防ぐ-iためにフラグを追加する必要があるかもしれません。mv

関連情報