サブディレクトリを作成し、ファイル名に基づいて日付別にファイルを構成します。

サブディレクトリを作成し、ファイル名に基づいて日付別にファイルを構成します。

私は次のスクリプトを使って写真を「日付」ディレクトリにまとめました。

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

このスクリプトはうまく機能します。私の写真ファイルは、写真の撮影日時「IMG_20131125_090000.JPG」と同じ命名規則に従います。上記のスクリプトを変更して日付ディレクトリに並べ替えますが、ファイルが変更された日付を使用するのではなく、ファイル名に日付を使用する方法はありますか?

ベストアンサー1

回答は20131125の代わりに2013-11-25に修正されました。

互換性のあるシェルを使用してスクリプトをbash実行する場合、最も簡単な解決策は置き換えることです。

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)

ディレクトリ名として2013-11-25の代わりに20131125が必要な場合は、次のこともできます。

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')

おすすめ記事