作成時間に基づいて複数のファイルの名前を変更するには?

作成時間に基づいて複数のファイルの名前を変更するには?
#!/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

シンボリックリンクが解決された後、ファイルの最後の修正時刻に対応する日付を報告する-rGNUオプションを使用してください(例:this)。datels -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

statGNUや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によって異なります。そしてそのタイムスタンプは一般的に役に立ちません。バラよりstatexiftoolファイルが作成されるとまたはLinuxカーネルにはまだファイル作成日を取得するためのインターフェースがありませんか?もっと学ぶ。


1 ただし、以前のバージョンのUnixにはコマンドがありましたstat。何らかの理由で、Unix v6の研究ではこれ以上機能がないため、70年代半ばに消えたようです。

おすすめ記事