ドイツ語の「現在」日付を含むディレクトリ名をYYYY-MM-DDに変換します。

ドイツ語の「現在」日付を含むディレクトリ名をYYYY-MM-DDに変換します。

MacのiPhotoから写真をエクスポートしました。ディレクトリ名は、ローカルの命名日(「Day.MONTH YYYY」)に従って指定されます。

8. Mai 2013/
13. Juli 2013/
31. Oktober 2014/

その一部にはGPSデータが付属しています。

Capdepera, 2. Juli 2013/
Stuttgart, 13. Februar 2013/
Marsa Alam, 31. Dezember 2011/

YYYY-MM-DD<.GPS-Data-if-exists> = 2013-07-02.Capdepera などのディレクトリ名が必要です。

cut -d',' -f1GPSデータと-f2日付部分を($ DatePartで)分割します。 2番目のステップでは、ドット "."を使用して日付部分を日と月+年で除算し、最後の4桁を年として使用します。その後、私は得るでしょう

GPS="Capdepera"
DAY=02      # fill leading zero is no issue.
MONTH=Juli
YEAR=2013

ここで、月を数値にマップするために、次のような配列を作成します。

Monate="
Januar=01\n
Februar=02\n
Juli=07\n
"

その結果、echo -e $Monate | grep $MONTH| cut -d'=' -f207が出ました。これで、すべてのエントリを最終ディレクトリ名に関連付けて名前を変更できます。

今私の質問は:上記のようなより簡単な方法はありますか?つまり-f2、SQL関数Convert()などの日付変換は、最初のステップで日付部分を使用した後、段階的に分割や配列なしで結果を提供します。

Convert("$DatePart", +%Y-%m-%d) => 2013-07-02

ありがとう、セラル

答え1

適切な最新バージョンのPerlがある場合は、Perlベースのrenameユーティリティを使用します(特に古いバージョンでは、英語ではなく月と曜日の名前を解析する方法をTime::Piece提供していません)。use_locale

$ LC_TIME=de_DE.UTF-8 rename -n -- '
    BEGIN{use Time::Piece; Time::Piece->use_locale()};
    s/(.*?), (\d+\. \w+ \d+)/Time::Piece->strptime($2,"%d. %B %Y")->strftime("%Y-%m-%d.$1")/e
  ' *,\ */
rename(Capdepera, 2. Juli 2013/, 2013-07-02.Capdepera/)
rename(Marsa Alam, 31. Dezember 2011/, 2011-12-31.Marsa Alam/)
rename(Stuttgart, 13. Februar 2013/, 2013-02-13.Stuttgart/)

LC_TIME=de_DE.UTF-8そのロケールですでにドイツ語の日付/時刻を使用している場合は、この割り当てを省略できます。 GPSデータ文字列がないより簡単な場合は、練習問題として残してください。

関連情報