既存モデルの現状

既存モデルの現状
  • パール名の変更1.14-1

  • Arch Linux: Linux 6.2.12.arch1-1

次のいずれかのパターンで名前が付けられた複数のサブディレクトリを持つディレクトリ/フォルダがあります。

既存モデルの現状

something-AAA-2023-01-BBB (the most common pattern)
something-2023-01-AAA.BBB (the 2nd or 3rd most common pattern)
2023-01-AAA-BBB-CCC.DDD (the 2nd or 3rd most common pattern)
something-AAA-2023-01-BBB-CCC.DDD   
1111-AAA-2023-01-BBB.CCC
1111-2023-01-AAA.BBB

モード情報:

  • 「something」は常に文字列で、「1111」は数値です。
  • そのうちのいくつかは、明確にするために「2023-01」と表示されているYYYY-MM形式の日付です。
  • AAA、BBBなど大文字の3桁部分はフォルダ全体の文脈で意味のある普通の単語である場合もあり、フォルダ全体の文脈でも意味のある文字と数字の混ざった組み合わせである場合もあります。 。 AAA、BBBなどはすべてフォルダの文脈で意味のある表現です。
  • 時間が経つにつれて、フォルダ名に追加情報が追加されましたが、これがCCCとDDDがある理由です。

期待される出力

これが発生する前に、要素(「1111」、AAA、BBBなど)が

1111.AAA.2023-01.something.BBB.CCC.DDD

まず、最初のハイフンと2番目のハイフン(ある場合)の間にある内容を見つけてキャプチャしたいと思います。

今まで

perl-rename -n 's/^(.+)\-(.+)\-(\d{4}\-\d{2})\-(.+)/\3\.\1\./' *

しかし、それは実際に「スマート」ではありません。日付が最初と2番目のハイフンの間、または2番目と3番目のハイフンの間、(\d{4}\-\d{2})日付の前後であるかどうかを確認する方法はありますか?それとも、日付の前後の内容を定義する括弧の数で、さまざまなケースをすべて見つける必要がありますか? (私の英語でごめんなさい)

それとも、その日付文字列の前のハイフンが2番目のハイフンであるかどうかを確認する方法は?特定の文字がn番目に現れるものを見つけることは後で間違いなく役に立ちます。

ベストアンサー1

区切り文字に基づいて列を分割するautosplitパターンを使用して、同様のアプローチを試すことができます。これにより、作業が簡単になります。-F-

自動的に生成された配列内の日付文字列を含むn番目の要素の位置を見つけるには、@F次のコードを使用します。

$ ls
1111-AAA-2023-01-BBB.CCC
$ perl -F'-' -nE '
    foreach my $i (keys @F) { say $i if "$F[$i]-$F[$i+1]" =~ m/\d{4}-\d{2}/; }
' < <(printf '%s\n' *)
2
  1111-AAA-2023-01-BBB.CCC
# ^^^^ ^^^ ^^^^ ^^ ^^^^^^^
#  0    1   2    3    4     keys of @F array

2年を含む配列要素のキー。次の要素は月です。

さて、それに基づいて名前を変更する必要がある入力ファイルと予想される出力を私に提供してくださいrename

おすすめ記事