ファイル名のタイムスタンプを変更するにはどうすればよいですか?


8

私は時系列でdatファイルの名前を持っています:

FileName_YYYY_MM_DD_HHMM.dat

各タイムスタンプに30分を追加するコマンドはありますか?


1
それらのタイムスタンプは作成日と同じですか?それは同じls --full-timeですか?
Sergiy Kolodyazhnyy

1
いいえ、タイムスタンプは作成/変更された日付とは異なります。タイムスタンプは、データが測定された時間に基づいています。
strawberrie

1
これらのタイムスタンプはカスタムなので、日付に30分を追加して計算する必要があるスクリプトが必要になるため、単純なコマンドはありません。だから人々が反応するのに少し時間がかかるかもしれません
セルギー・コロディアズニー

1
深夜に近いタイムスタンプはありますか。たとえば、30分を追加すると、1日ずつ変更する必要がある場合があります。
Sergiy Kolodyazhnyy

1
時間はどのような形式ですか?12、次に1,2,3(12時間形式)または12から13から14、15。。。23、00(24時間形式)?
Sergiy Kolodyazhnyy

回答:


6

使用python

#!/usr/bin/env python2
import glob, re, os, datetime
os.chdir('/path/to/dir')
for f in glob.glob('*.dat'):
    ini_time = datetime.datetime.strptime(re.search(r'(?<=_)(?:\d|_)+(?=.dat$)', f).group(), '%Y_%m_%d_%H%M')
    fin_time = (ini_time + datetime.timedelta(minutes=30)).strftime('%Y_%m_%d_%H%M%S')
    os.rename(f, 'Filename_' + str(fin_time) + '.dat')
  • os.chdir('/path/to/dir')現在のディレクトリを.datファイルを含むディレクトリに変更します。/path/to/dir実際のパスに置き換えます。

  • glob.glob('*.dat') 末尾がのファイルが見つかります .dat

  • ini_time変数は、最初にreモジュールを使用して元のファイル名から日時を切り取り、次に、必要な時間をこれに追加できるように、取り出された文字列の内容を表すエントリを並べ替えます

  • fin_time結果の時間、つまりini_time30分が含まれます

  • os.rename それに応じてファイルの名前を変更します。

また、連続したファイル名(30分異なる)では、名前が変更されたファイルが次のファイルを上書きするため、安全性を維持するために、名前を変更したファイル名に秒を追加することをお勧めします。それ以外の場合は、名前を変更したファイルを別のディレクトリに保存し、後で元のファイルと置き換える必要があります。


あなたとパイソン、素晴らしい愛。=)+1
AB

Filename_renameメソッドでは文字列を使用しないでください。
AB

@ABなぜですか?(あなたも+1)
heemayl

Pythonスクリプトを実行した後にいくつかのファイルが見つからない理由を知っていますか?各ファイルのタイムスタンプには30分の差があります。以下は、最初のいくつかのファイル名の出力は、次のとおりです。Filename_2011_01_11_1630.dat Filename_2011_01_11_1830.dat Filename_2011_01_11_1900.dat Filename_2011_01_11_2030.dat Filename_2011_01_11_2100.dat
strawberrieは、

@strawberrieわからない..テストして問題なく動作した。スクリプトを実行し/path/to/fileて、をディレクトリへの完全パスで置き換えましたか?
heemayl

2

を使用するbashと、名前が変更されたファイルは新しいサブフォルダにありますrenamed

ファイルが置かれているフォルダーでスクリプトを開始します。

#!/bin/bash

mkdir -p renamed   

# loop over all dat files in the current folder
for f in *.dat; do

    # the filename without extension    
    filename="${f%%.*}"

    # your timestamp
    old_timestamp=$(echo $filename | grep -P "[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}$")

    if [ "$old_timestamp" == "" ]; then
        >&2 echo "not a valid filename: '$f', skipped."
    else
      # a valid date from the timestamp
      new_date=$(echo "$old_timestamp" | awk -F_ '{HM=NF; D=NF-1; M=NF-2; Y=NF-3; print $Y "-" $M "-" $D " " substr($HM,1,2) ":" substr($HM,3,2) ":00"}')

      # the new time stamp, 30 mins in the future
      changed_timestamp=$(date --date "$new_date 30 minutes" "+%Y_%m_%d_%H%M")

      # copy the file, ${f##*.} is the extension
      cp "$f" renamed/"${filename/$old_timestamp/$changed_timestamp.${f##*.}}"
    fi
done

出力例:

% ls -og FileName*
-rw-rw-r-- 1 0 Mai 16 20:35 FileName_2015_05_16_2235.dat

% ./timestamp

% ls -og renamed/FileName*
-rw-rw-r-- 1 0 Mai 16 20:35 FileName_2015_05_16_2305.dat

@strawberrie、名前が変更されたファイルはサブフォルダーに配置されますrenamed
AB

名前を変更したファイルを追加のフォルダーに保存することをお勧めします。何かがうまくいかない場合でも、OPにはまだオリジナルがあります。良い考え、それゆえ+1
セルギー・コロディアズニー

TimeChange.sh:21:おかげで、私はあなたのスクリプトを実行した後、次のエラーを得た@AB TimeChange.sh:バッド置換私の実際のファイル名やタイムスタンプの前に固定プレフィックスはFileName_123.Data_YYYY_MM_DD_HHMM.datのようなものです
strawberrie

定義ごとにFileName_123.Data_YYYY_MM_DD_HHMM.dat、パーツ.Data_YYYY_MM_DD_HHMM.datは拡張です。したがってFileName_123、有効なタイムスタンプではありません。
AB

@strawberrie私はスクリプトを変更しました
AB

1

脚本

これは私のオリジナルのスクリプトを編集したバージョンです。OPは当初、命名形式に関する完全な情報を提供していませんでした。このスクリプトは、コメントで述べられているOPが正しいファイルの命名であったものに適応します。

*テクニカルノート:*

このスクリプトでは、awkを使用してファイル名を6つの個別のフィールドに分割し、フィールドの区切り文字としてアンダースコアを使用しています。最初の2つのフィールド、$ 1と$ 2は静的テキスト文字列と見なされます。フィールド3、4、5、および6は、OPのデータがサンプリングされたタイムスタンプであり、ファイルシステムでのファイルの作成日ではありません

変数COPYDIRは、更新されたタイムスタンプを持つファイルが移動する新しいディレクトリの名前を保持します。現在の作業ディレクトリにそのディレクトリを作成しますmkdir $COPYDIR

変数TEXTSTRINGとDATESTRINGは、静的テキストとタイムスタンプをそれぞれ保持します。以下のサンプル出力では、2つの異なる文字列を使用して、最初の2つのフィールドが保持するテキストに関係なくスクリプトが機能することを証明しています。

NEWEPOCHTIMEは、計算された新しいタイムスタンプをUNIXエポック形式で保持する変数です。NEWDATEは、UNIXエポックからYYYY-MM-DD HH:MM形式に変換されたタイムスタンプを保持する変数です。NEWAPPENDは、OPの希望するYYYY_MM_DD_HHMM形式でファイルに追加される実際のタイムスタンプです。

cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".dat 更新されたデータスタンプを使用して、古いファイルを「converted_files」ディレクトリに移動します(データの損失を防ぐために移動するのではなく)。

:スクリプトは、名前付け形式が実際に実行されている限り、つまりすべてのファイルが実際SomeText_123.Data_YYYY_MM_DD_HHMM.datフォーマットされている限り機能します。

#!/usr/bin/env bash
#
# Author: Serg Kolo
# Description: this script takes timestamp within the filename
# (which may be different from file's actual creation date)
# converts that date and time to unix's epoch time
# adds 30 minutes to it and renames it

COPYDIR="converted_files"
mkdir $COPYDIR

for file in *.dat; do
        TEXTSTRING=$(stat -c %n $file | awk -F'_' '{print $1"_"$2"_"}' )
        DATESTRING=$( stat -c %n $file | awk -F'_' '{gsub(".dat","");  print $3"-"$4"-"$5" "$6}' )
        NEWEPOCHTIME=$( expr $( date --date="$DATESTRING" +%s ) + 1800 )
        NEWDATE=$(date --date=@"$NEWEPOCHTIME" +%F"_"%R)
        NEWAPPEND=$(echo $NEWDATE | awk '{gsub("-","_");gsub(":","");print}')
        cp $file "$COPYDIR"/"$TEXTSTRING""$NEWAPPEND".dat
done

実行中のスクリプト

以下のデモは、私の端末からの直接コピーです。最初の2つのフィールドに2つの異なる文字列を含む元のファイルを作成したことに注意してください。したがって、アンダースコアで区切られた文字列が2つしかない限り、このスクリプトはファイル名の先頭が何であっても機能するはずです。

スクリプトの名前は notes-conversion、この質問に取り組んでいる間に取ったメモからスクリプトを開発したためにた。

HHMM部分が2345(真夜中の15分前)であるファイル名は0015に更新され、DD部分は翌日に更新されることに注意してください。24時間形式が保持されます。

さらに、forループは.datファイルのみを検索するため、たまたま作業ディレクトリにある可能性のある他のファイルまたはディレクトリの名前を変更せず、データ損失の可能性を回避します。以下の例では、元のディレクトリに11のアイテムがあり、そのうち3つは*.txtテスト用のファイルであるため、8つの.datファイルしか処理しません。更新されたファイルが置かれるディレクトリには、8つのファイルが.datあり、他のファイルはありません。データは安全で、スクリプトはその役割を果たします。

[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
85 $ ls
FileName_123.Dat_2015_05_31_1245.dat  Test.txt
FileName_123.Dat_2015_05_31_2345.dat  YoloSwag_123.Dat_2015_05_31_1245.dat
FileName_Foo.Bar_2015_05_31_1245.dat  YoloSwag_123.Dat_2015_05_31_2345.dat
FileName_Foo.Bar_2015_05_31_2345.dat  YoloSwag_Foo.Bar_2015_05_31_1245.dat
File.txt                              YoloSwag_Foo.Bar_2015_05_31_2345.dat
Random.txt

[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
86 $ ls | wc -l
11

[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
87 $ notes-conversion                                                                                

[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
88 $ ls converted_files/; ls converted_files/ | wc -l                                                
FileName_123.Dat_2015_05_31_1315.dat  YoloSwag_123.Dat_2015_05_31_1315.dat
FileName_123.Dat_2015_06_01_0015.dat  YoloSwag_123.Dat_2015_06_01_0015.dat
FileName_Foo.Bar_2015_05_31_1315.dat  YoloSwag_Foo.Bar_2015_05_31_1315.dat
FileName_Foo.Bar_2015_06_01_0015.dat  YoloSwag_Foo.Bar_2015_06_01_0015.dat
8

[67 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
89 $ 

説明(元の投稿から)

*)今日、Unix-Linuxシステムはエポック時間で時間をカウントすることを学びましでか、単に秒を置く。

*)スクリプトは各ファイル名を取得し、日付を抽出し、それをepochに変換し、1800秒(正確には30分)を追加し、新しいタイムスタンプを付けてファイルを保存します。

*)このスクリプトはOPの要求に対応します-ファイル自体の作成時刻を更新するのではなく、ファイル名のタイムスタンプを変更します

使用したツール:

  • Ubuntu 15.04

  • GNU bash 4.3.30

  • GNU awk 4.1.1

  • 日付(GNU coreutils)8.23


ちなみに、ls | wc -l beforeは36ファイルを提供し、script後も36ファイルを提供し、欠落がない
Sergiy Kolodyazhnyy

また、私がstat -c%nファイルを使用する理由は、lsの出力を解析することは一般に良い考えではないためです。一部の人々はfindコマンドも使用していますが、これも良いことです。
Sergiy Kolodyazhnyy

@Sergに感謝します。スクリプトを実行した後、フォルダーに残っている727ファイルのうち2ファイルしか残しなかった理由がわかりません...
Straberberrie

実際のファイル名と投稿した例の間に違いはありましたか?
Sergiy Kolodyazhnyy

また、「Script in action」の最初の行を実行しましたか?rm *は、自分のディレクトリをクリーンアップしてから、ファイル名に異なる日付の一連のテストファイルを作成するためのものでした。あなたはそれを実行するべきではありませんでした
セルギー・コロディアズニー

-1

このコードを使用して、必要なことを行うことができます

  1. 最初にバックアップを取り、コードをテストして、それがあなたのケースに適しているかどうかを確認する必要があります
  2. あなたは24Hフォーマットを使用しています
  3. 23:29以降に名前が付けられるファイルはありません(それ以降にファイルがある場合は、日付も変更するようにコードを変更する必要があります)

コードは:

cd /path/to/the/files

for i in `ls`; do MM=${i:(-6): -4}; HH=${i: -8 : -6 }; NAME=${i: 0 : -8 } ; if [ "$MM" -lt 30 ] ; then  NEWMM=$((10#$MM+30)); mv -f $i $NAME$HH$NEWMM.dat ; else NEWHH=$((10#$HH+1));NEWMM=$((10#$MM-30)) ; mv -f $i $NAME$NEWHH$NEWMM.dat ; fi ; done ;

仕組み: コードはファイル名の分の部分をチェックし、 MM30未満の場合は30を追加し、MM30以上の場合はHH、名前の部分に1時間を追加し、30分を差し引きますMM名前の一部


投票者がダウンしている場合は、その理由をお知らせください。
Fat Mind、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.