ファイル名のEPOCH文字列を読み取り可能な形式に変換します。

ファイル名のEPOCH文字列を読み取り可能な形式に変換します。

私のUnixの知識はそれほど良くありません。私はディレクトリ内のファイルセットの名前を変更するシェルスクリプトを作成しようとしています。1709532255.mp4ここで、20240304_070415.mp4エポック1709532255時間は常にエポック時間である。

私は見つけた

date -d @1708532255 +'%Y%m%d_%H%M%S'

...必要な形式を提供しますが、スクリプトで動作させることはできません。

これは私のスクリプトです。

#!/bin/bash
for file in /media/HAVideo/Eingang/Test/2/*.mp4
do
filename=`echo "${file}" | cut -d'.' -f1`
readable=`date -d @$filename +"%Y%m%d%H%M%S"`
mv "${file}" "${readable}"
done

出力は次のとおりです

...
date: invalid date '@/media/HAVideo/Eingang/Test/2/1709532255'
mv: can't rename '/media/HAVideo/Eingang/Test/2/1709532255.mp4': No such file or directory
...

答え1

逃したばかりの内容cd:

#!/bin/bash

cd /media/HAVideo/Eingang/Test/2/ || exit # <- what changed
for file in *.mp4
do
filename=`echo "${file}" | cut -d'.' -f1`
readable=`date -d @$filename +"%Y%m%d%H%M%S.mp4"`
mv "${file}" "${readable}"
done

しかし、いくつかの問題があります。

代わりにバックティックを使用してください$( )。そしてインデントを正しくしてください。

バラよりhttp://mywiki.wooledge.org/BashFAQ/082

より良いバージョン:

#!/bin/bash -

cd /media/HAVideo/Eingang/Test/2/ || exit
for file in *.mp4 ; do
    mv -- "$file" "$(date -d "@${file%.*}" +"%Y%m%d%H%M%S.mp4")"
done

${file%.*}組み込みパラメータ拡張

望むより:http://mywiki.wooledge.org/BashFAQ/073そして
LESS='+/Parameter Expansion' man bash
また参照wiki.bash-hackers.org/syntax/pe

これはkshの標準sh演算子であり、このコードにはbashismがないため、shebangを#! /bin/sh -bashの依存関係に変更して削除できます。ただし、これはdate -d非標準のGNU注意であるため、printf '%(format)T'最新バージョンのbash(ksh93からコピー)を使用するとこれを防ぐことができます。

答え2

そしてzsh

$ zmodload zsh/datetime
$ autoload zmv
$ cd /media/HAVideo/Eingang/Test/2/
$ zmv -n '(<->)(.mp4)' '$(strftime %Y%m%d_%H%M%S $1)$2'
mv -- 1709532255.mp4 20240304_060415.mp4

-n満足すれば削除(テスト実行))。

1709532255は時間帯に依存しませんが、20240304_060415そうではなく、あいまいです。 UTCオフセットを含むISO8601スタイルの日付形式を使用して、現地時間を明確にし、引き続き使用できます。%Y%m%d_%H%M%Sたとえば、同じタイムスタンプを%FT%T%z取得できますが、2つの異なるタイムゾーンに2024-03-04T06:04:15+0000あります。2024-03-04T07:04:15+0100

答え3

エラーが表示される理由:

date: invalid date '@/media/HAVideo/Eingang/Test/2/1709532255'

これは、コマンドが拡張子を除くファイルのフルパスを渡したためですcut

[...snipped out irrelevant parts...]
filename=`echo "${file}" | cut -d'.' -f1`
...
readable=`date -d @$filename +"%Y%m%d%H%M%S"`

評価:

readable=`date -d @/media/HAVideo/Eingang/Test/2/1709532255 +"%Y%m%d%H%M%S"`

ですからfilenameそうです/media/HAVideo/Eingang/Test/2/1709532255

あなたのスクリプトはほとんど動作します。filename=...フルパスではなくファイルのデフォルト名のみを取得するように行を変更しました。

#!/bin/bash
for file in /media/HAVideo/Eingang/Test/2/*.mp4
do
filename=`basename "${file}" | cut -d'.' -f1`
readable=`date -d @$filename +"%Y%m%d%H%M%S"`
mv "${file}" "${readable}"
done

もちろん、ファイル拡張子を削除して変数名を変更してコードをより明確にすることもできcutますbasename

for src in /media/HAVideo/Eingang/Test/2/*.mp4
do
  epoch="$(basename "$src" .mp4)"
  dst="$(date -d "@$epoch" +"%Y%m%d%H%M%S")"
  mv "$src" "$dst"
done

答え4

使用(すべてのオペレーティングシステムで動作)

perl -MTime::Piece -e '
    for (@ARGV) {
        my $file = $_;
        s/\..*$//;
        rename $file, Time::Piece->strptime($_, "%s")->strftime("%Y%m%d_%H%M%S")
    }
' *.mp4

Time::PieceモジュールはPerlでパッケージ化されており、インストールは不要です。

関連情報