私は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+1
RLENGTH-7
入力ファイル名に応じて20160624
ie が生成されます。日付だけあり、時間はありません。 ~から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つの文字を追加する必要がありますmm
。RLENGTH-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