web-dev-qa-db-fra.com

Comment puis-je changer l'horodatage du nom de fichier?

J'ai les noms des fichiers de données dans l'ordre chronologique:

FileName_YYYY_MM_DD_HHMM.dat

Existe-t-il des commandes permettant d'ajouter 30 minutes à chaque horodatage?

8
strawberrie

Utiliser 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') changera le répertoire actuel en répertoire contenant les fichiers .dat. Remplacez /path/to/dir par le chemin réel.

  • glob.glob('*.dat') trouvera les fichiers se terminant par .dat

  • La variable ini_time coupe d'abord la date et l'heure du nom de fichier d'origine à l'aide du module re, puis détermine quelle entrée représente ce qui est dans la chaîne extraite afin que nous puissions ajouter l'heure requise. pour ça

  • fin_time contiendra le temps résultant, à savoir ini_time plus 30 minutes.

  • os.rename renommera le fichier en conséquence.

Notez également que, avec les noms de fichiers successifs (différés de 30 minutes), le fichier renommé écrasera le suivant, il est donc préférable d’ajouter les secondes au nom de fichier renommé pour qu’il reste en sécurité. Sinon, vous devez enregistrer les fichiers renommés dans un répertoire différent, puis les remplacer ultérieurement par ceux d'origine.

6
heemayl

En utilisant bash, les fichiers renommés sont dans un nouveau sous-dossier renamed.

Démarrez le script dans le dossier où se trouvent les fichiers.

#!/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

exemple de sortie:

% 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
2
A.B.

SCRIPT

Ceci est la version éditée de mon script original. A l'origine, OP ne fournissait pas d'informations complètes sur le format de nommage. Ce script s’adapte à ce que l’OP mentionné dans les commentaires était le nom correct du fichier.

* Notes techniques: *

Dans ce script, nous séparons le nom de fichier en 6 champs distincts à l’aide de awk, avec le soulignement comme délimiteur de champ. Les deux premiers champs, $ 1 et $ 2 sont considérés comme une chaîne de texte statique. Les champs 3, 4, 5 et 6 sont l'horodatage auquel les données d'OP ont été échantillonnées, et non la date de création du fichier sur le système de fichiers.

La variable COPYDIR contient le nom du nouveau répertoire dans lequel seront stockés les fichiers dont l'horodatage est mis à jour. Nous créons ce répertoire dans le répertoire de travail actuel avec mkdir $COPYDIR

Les variables TEXTSTRING et DATESTRING contiennent respectivement du texte statique et de l'horodatage. Dans l'exemple ci-dessous, j'ai utilisé deux chaînes différentes pour prouver que le script fonctionnera quel que soit le texte contenu dans les deux premiers champs.

NEWEPOCHTIME est une variable qui contient le nouvel horodatage calculé au format Epoch unix. NEWDATE est une variable qui contient l’horodatage converti d’un format d’époque au format AAAA-MM-JJ HH: MM. NEWAPPEND est l'horodatage réel qui sera ajouté au fichier au format YYYY_MM_DD_HHMM souhaité par OP.

cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".dat copie l'ancien fichier dans le répertoire "convert_files" (au lieu de le déplacer pour éviter la perte de données) avec le datastamp mis à jour.

Remarque , le script fonctionnera tant que le format de dénomination est réellement suivi , c’est-à-dire que tous les fichiers sont vraiment avoir le format 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

SCRIPT IN ACTION

La démonstration ci-dessous est une copie directe de mon terminal. Notez que j'ai créé des fichiers originaux avec deux chaînes différentes dans les deux premiers champs. Donc, ce script devrait fonctionner quel que soit le début du nom de fichier, tant qu'il n'y a que deux chaînes séparées par un trait de soulignement.

Le script s'appelle notes-conversion parce que j'ai développé le script à partir des notes que j'ai prises pendant que je travaillais sur cette question.

Notez que les noms de fichiers dont la partie HHMM est 2345 (15 minutes avant minuit) sont mis à jour en 0015 et la partie DD au jour suivant. Format 24 heures préservé.

De plus, comme la boucle for ne recherche que les fichiers .dat, nous évitons de renommer d’autres fichiers ou répertoires susceptibles de figurer dans le répertoire de travail, évitant ainsi toute perte de données potentielle. Dans l'exemple ci-dessous, le répertoire d'origine contient 11 éléments, dont 3 sont des fichiers *.txt à tester. Nous ne travaillons donc qu'avec des fichiers 8 .dat. Dans le répertoire où se trouvent les fichiers mis à jour, nous voyons 8 fichiers, tous .dat et aucun autre fichier. Les données sont en sécurité, le script fait son travail.

[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 $ 

EXPLICATION (du message original)

*) Aujourd'hui, j'ai appris que les systèmes Unix-Linux comptent le temps en époque , ou simplement en secondes.

*) le script prend chaque nom de fichier, extrait la date, le convertit en Epoch, ajoute 1800 secondes (ce qui correspond exactement à 30 minutes) et enregistre le fichier avec un nouvel horodatage.

*) Ce script adresse ce que l'OP voulait - changer l'horodatage du nom de fichier, pas la date de création du fichier lui-même

Outils utilisés:

  • ubuntu 15.04

  • GNU bash 4.3.30

  • GNU awk 4.1.1

  • date (coreutils GNU) 8.23

1