ファイル名に基づいてファイルタイムスタンプを変更するスクリプト

ファイル名に基づいてファイルタイムスタンプを変更するスクリプト

私はmacOS環境を使用しています。

名前が次の形式で始まる複数のファイルのタイムスタンプを変更したいと思います。

XXXXX_DD_MM_YYYY_HH-MM-SS_

以下はファイル名の例です。

CALLU_16-10-2018_10-58-26_p123456789012.mp3

作成および変更日は2018-10-16 10:58:26に変更する必要があります。

次の形式のスクリプトがありますCall@1234567890(1234567890)_20160624205913。ファイル名の末尾から、日付と時刻を次のパラメータに抽出しますtouch -t STAMP

for f in *; do
    t="$(awk '/_.*/ { match($0, /_.*/)
                      print substr($0, RSTART + 1, RLENGTH - 7)
                    }'<<<"$f" )"
    touch -t "$t" "$f" 2>/dev/null
done

答え1

古い質問

前のスクリプトはファイル名の最初の文字をawk検索し、次の文字()から最後の6文字(:+ 1-7 = -6)まですべての項目を使用しました。_RSTART+1RLENGTH-7

入力ファイル名に応じて20160624ie が生成されます。日付だけあり、時間はありません。 ~からtouch仕様:

オプション引数は、次の形式の10進数でなければなりません。

[[CC]YY]MMDDhhmm[.SS]

各 2 桁の数字は、次を表します。

MM
 The month of the year [01,12].
DD
 The day of the month [01,31].
hh
 The hour of the day [00,23].
mm
 The minute of the hour [00,59].
CC
 The first two digits of the year (the century).
YY
 The second two digits of the year.
SS
 The second of the minute [00,60]. 

...8桁の数字だけで「20」が月と解釈されるという意味です。間違った日付。しかし、あなたはそうしないでしょう。touchなぜなら…2>/dev/null

hhたとえば、を使用しておよびを提供するには、さらに4つの文字を追加する必要がありますmmRLENGTH-3。ただし、これは古いファイル名にのみ適用されます。

新しい質問

ファイル名では、CALLU_16-10-2018_10-58-26_p123456789012.mp3日付16-10-2018はリトルエンディアンシーケンス(DD-MM-CCYY)なので、awkスクリプトはコンポーネントを置き換えて区切り文字を削除する必要があります。

awk -F '[-_]' '{print $4$3$2$5$6"."$7}'

(入力ファイル名に-日付より前に他の文字が含まれている場合は、s first間の部分を抽出するために追加の手順を実行する必要があります_。)

サンプルファイルを使用してテストします。

$ echo 'CALLU_16-10-2018_10-58-26_p123456789012.mp3' | awk -F '[-_]' '{print $4$3$2$5$6"."$7}'
201810161058.26

したがって、更新されたスクリプトは次のようになります。

for f in *.mp3; do
    t=$(echo "$f" | awk -F '[-_]' '{print $4$3$2$5$6"."$7}')
    touch -t "$t" "$f"
done

関連情報