#!/bin/sh
for f in *.png
do
echo mv -n "$f" "$(date +%Y%m%d-%H-%M-%S)_$f"
done
()で説明されているように、タイムスタンプを使用して複数のファイルの名前を変更したいのですが、上記のコードを実行するls -lt --full-time
と、名前は現在の日付/時刻または変更時刻を使用します。 yymmdd形式の年、月、日が必要です。
答え1
シンボリックリンクが解決された後、ファイルの最後の修正時刻に対応する日付を報告する-r
GNUオプションを使用してください(例:this)。date
ls -Ll
#!/bin/sh -
for f in *.png
do
t=$(date -r "$f" +%Y%m%d-%H-%M-%S) &&
echo mv -n -- "$f" "${t}_$f"
done
または、組み込み関数を使用して任意のzsh
形式stat
で時間形式を指定します。
#! /bin/zsh -
zmodload zsh/stat || exit
for f (*.png(N))
stat -A t -F %Y%m%d-%H-%M-%S +mtime -- $f &&
print -r mv -n -- $f ${t}_$f
stat
GNUやBSDを含む一部のシステムでは、完全に異なるAPI(zshと互いに)を使用しても独自のコマンドを追加しました(後で1)。
exiftool
また、その属性に基づいてファイル名を変更することもできます。
exiftool -d %Y%m%d-%H-%M-%S '-FileName<${FileModifyDate}_${FileName}' -- *.png
これらすべてと一緒にファイルの最後の修正時間を確認してくださいls -lt --full-time
(これらのpngファイルの一部がシンボリックリンクの場合は追加のファイルが必要です)。-L
これはファイルの内容の作成時間と考えることができ、一般的に興味のある部分です。 Linuxのファイルにはいわゆる出生時間また〜として知られています作成時間これはファイルが生成された時間を反映します(ただし、コンテンツが生成された時間とほとんど関係ありません)。
ls
最新のカーネルとGNU libc(CentOSにはありません)がある最新ls --time=birth -Ll --full-time
バージョンのGNUstat
の場合は、APIを使用してstat -Lc %w
検索できますdate
。これを行うAPIは最近非常に複雑で、Linuxによって異なります。そしてそのタイムスタンプは一般的に役に立ちません。バラよりstat
exiftool
ファイルが作成されるとまたはLinuxカーネルにはまだファイル作成日を取得するためのインターフェースがありませんか?もっと学ぶ。
1 ただし、以前のバージョンのUnixにはコマンドがありましたstat
。何らかの理由で、Unix v6の研究ではこれ以上機能がないため、70年代半ばに消えたようです。
答え2
stat
ファイルの日付を取得するには、コマンドを使用する必要があります。ファイルの作成日(生年月日)や修正日を取得したいかわかりません。これら2つの日付を使用して例を提供します。
生年月日の使用
#!/bin/sh
for f in *.png
do
cdate=$(stat -c '%w' "$f" | cut -d ' ' -f1)
echo mv -n "$f" "${cdate}_$f"
done
変更された日付の使用
#!/bin/sh
for f in *.png
do
mdate=$(stat -c '%y' "$f" | cut -d ' ' -f1)
echo mv -n "$f" "${mdate}_$f"
done
stat -c '%w' somefile
作成日/生年月日を確認でき、修正日も確認できますstat -c '%y' somefile
。
上記のコードはYYYYMMDD
形式で日付を返します。型を取得するには、YYMMDD
パラメータ拡張を適用できます(POSIXでサポートされているかどうかはわかりませんsh
)。以下は別の例です(bashを使用)。
生年月日の使用
#!/bin/bash
for f in *.png
do
cdate=$(stat --printf='%.10w\n' "$f")
echo mv -n "$f" "${cdate#??}_$f"
done
変更された日付の使用
#!/bin/bash
for f in *.png
do
mdate=$(stat --printf='%.10y\n' "$f")
echo mv -n "$f" "${mdate#??}_$f"
done
stat --printf='%.10w\n'
またはを使用して、stat --printf='%.10y\n'
日付形式を表す文字列の最初の10文字を取得しましたYYYYMMDD
。${cdate#??}
またはを使用して${mdate#??}
日付の最初の2桁を削除すると、YYMMDD
その日付形式を取得できます。