私の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でパッケージ化されており、インストールは不要です。