ディレクトリ名の末尾の年を前に移動します。 YYYY-MM-DD形式に変換できます。

ディレクトリ名の末尾の年を前に移動します。 YYYY-MM-DD形式に変換できます。

MacからPCにすべての写真をエクスポートしました(Windows 11、PowerShellでUbuntuを実行)。エクスポートは元の作成日を削除し、フォーマットで各ディレクトリ(何千ものフォルダ)を作成しました。

April 1, 2004         
Amsterdam, September 18, 2018    
Anderson Arbor, March 24, 2011   

日付で並べ替えたいです。これらの形式を次のように変更する方法についてのアイデアはありますか?

2004, April 1   
2018, Amsterdam, September 18    
2011, Anderson Arbor, March 24

または、より良い方法は次のとおりです。

2004-04-01    
2018-09-18 Amsterdam     
2011-03-24 Anderson Arbor

ベストアンサー1

そしてzsh

$ autoload -Uz zmv
$ zmodload zsh/datetime
$ zmv -n '(|(*), )([^ ]## <1-31>, <->)' \
         '$(strftime %F $(strftime -r "%B %d, %Y" $3))${2:+ $2}'
mv -- 'Amsterdam, September 18, 2018' '2018-09-18 Amsterdam'
mv -- 'Anderson Arbor, March 24, 2011' '2011-03-24 Anderson Arbor'
mv -- 'April 1, 2004' 2004-04-01

-n満足すれば削除(テスト実行))。

zmvバッチ名を変更するための自動ロード可能なzsh関数。

2つのパラメータが必要です。

  1. グローバルモード(拡張はそれ自体で行われるため、引用符で囲む必要がありますzmv)。
  2. 一致する各ファイルを置き換えるために文字列が評価されます。

置換で一致する各ペアは、...(...)にあります。$1$2

ここで、グローバルパターンは(|(*), )([^ ]## <1-31>, <->)次のとおりです。

  • (x|y)またはに一致するので、x何でもy一致する(|(*), )か(2番目のペアにあるため、代替項目で*終わる)で終了します。$2(...)", "
  • [^ ]x##1つ以上のxsと一致するスペースを除くすべての単一文字と一致するため、スペースではなく[^ ]##1つ以上の文字で構成されるすべてのシーケンスと一致します。
  • <->、境界なしの<x-y>すべての数字と一連の10進数と一致します。

代替では、モジュールstrftimeに組み込まれている関数を使用してからキャプチャされた日付をzsh/datetime解析(消費)し、フォーマットを再指定します。この組み込み機能はシンプルな標準インターフェースを提供し、それぞれフォーマットとアス機能を提供します。-r$3strftime()strptime()fptimestr

%F%Y-%m-%d日付形式を YYYY-MM-DD で表示する略語で、%B完全月名、%d特定の日付、%Y年を表します。


コマンドの置き換えに使用する代わりに、langinfoから月名のリストを取得してから手動で月番号と形式に変換できます。strftimeこれは、出力を得るために毎回プロセスをフォークすることを意味します。

zmodload zsh/langinfo
autoload -Uz zmv
months=( ${(v)langinfo[(I)MON_<1-12>]} )
#       1 2     3                 4         5
zmv -n "(|(*), )(${(j[|])months}) (<1-31>), (<->)" \
       '$5-${(l[2][0])months[(I)$3]}-${(l[2][0])4}${2:+ $2}'

どこ:

  • ${(v)langinfo[(I)MON_<1-12>]}キーが一致する連想配列の値に展開されますv$langinfoMON_<1-12>
  • ${(j[|])months} joins 配列の要素です|
  • $array[(I)$3]に格納されているパターンに一致する配列要素の最大インデックスを返します$3
  • ${(l[2][0])string} l2eftはsで文字列の長さを埋めます0

おすすめ記事