web-dev-qa-db-ja.com

サブディレクトリを作成し、ファイル名から日付でファイルを整理します

次のスクリプトを使用して、写真を「日付」ディレクトリに整理しています。

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

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

5
Wags

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

あなたが使用することができます:

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
3
Rahul Patil