Bagaimana saya bisa mengubah cap waktu nama file?

8

Saya memiliki nama file dat dalam urutan kronologis:

FileName_YYYY_MM_DD_HHMM.dat

Apakah ada perintah untuk menambahkan 30 menit ke setiap cap waktu?

strawberrie
sumber
1
apakah cap waktu itu sama dengan tanggal pembuatannya? itu sama ls --full-time?
Sergiy Kolodyazhnyy
1
Tidak, stempel waktu berbeda dengan tanggal dibuat / dimodifikasi. Stempel waktu didasarkan pada waktu data diukur.
strawberrie
1
Lihat, karena cap waktu itu adalah kustom, itu akan memerlukan skrip, yang harus menghitung menambahkan 30 menit ke tanggal, tidak akan ada perintah sederhana. jadi mungkin perlu sedikit bagi orang untuk merespons
Sergiy Kolodyazhnyy
1
Adakah perangko waktu yang dekat dengan tengah malam, sehingga menambahkan 30 menit dapat mengakibatkan kebutuhan untuk mengubah hari demi hari?
Sergiy Kolodyazhnyy
1
format apa itu jam? 12 kemudian 1,2,3 (format 12 jam) atau 12 hingga 13 hingga 14, 15. . . 23.00 (format 24 jam)?
Sergiy Kolodyazhnyy

Jawaban:

6

Menggunakan 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')akan mengubah direktori saat ini ke direktori yang berisi .datfile. Ganti /path/to/dirdengan jalur yang sebenarnya.

  • glob.glob('*.dat') akan menemukan file yang berakhiran .dat

  • ini_timevariabel pada awalnya akan memotong tanggal-waktu dari nama file asli menggunakan remodul dan kemudian memilah entri yang mewakili apa yang ada di string yang diambil sehingga kita dapat menambahkan waktu yang diperlukan untuk ini

  • fin_timeakan berisi waktu yang dihasilkan yaitu ini_timeditambah 30 menit

  • os.rename akan mengganti nama file sesuai.

Juga perhatikan bahwa, dengan nama file berurutan (berbeda 30 menit) file yang diganti nama akan menimpa yang berikutnya, maka lebih baik menambahkan detik ke nama file yang diubah namanya agar tetap aman. Kalau tidak, Anda perlu menyimpan file yang diubah namanya ke direktori yang berbeda dan kemudian menggantinya dengan yang asli nanti.

heemayl
sumber
Anda dan python, cinta yang luar biasa. =) +1
AB
Anda seharusnya tidak menggunakan string Filename_dalam metode rename.
AB
@ AB Kenapa begitu? (+1 untuk Anda juga)
heemayl
Apakah Anda tahu mengapa saya memiliki beberapa file yang hilang setelah menjalankan skrip python? Stempel waktu untuk setiap file memiliki perbedaan 30 menit. Berikut adalah output untuk beberapa nama file pertama: 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 Saya tidak tahu .. ini telah mengujinya dan bekerja dengan baik untuk saya tanpa masalah .. apakah Anda menjalankan skrip menggantikan /path/to/filedengan path lengkap ke direktori?
heemayl
2

Dengan menggunakan bash, file yang diganti nama berada di sub folder baru renamed.

Mulai skrip di folder tempat file berada.

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

contoh output:

% 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
AB
sumber
@strawberrie file yang diubah namanya sekarang ditempatkan di sub folderrenamed
AB
ide yang baik untuk menyimpan file yang diganti nama ke folder tambahan. Jika terjadi kesalahan, OP masih memiliki aslinya. Pemikiran yang bagus, karenanya +1
Sergiy Kolodyazhnyy
Terima kasih @ AB Saya mendapatkan kesalahan berikut setelah menjalankan skrip Anda: TimeChange.sh: 21: TimeChange.sh: Substitusi buruk Nama file aktual saya atau awalan tetap sebelum cap waktu seperti FileName_123.Data_YYYY_MM_DD_HHMM.dat
strawberrie
Per definisi, untuk FileName_123.Data_YYYY_MM_DD_HHMM.datbagiannya .Data_YYYY_MM_DD_HHMM.datadalah ekstensi. Dan karenanya FileName_123bukan cap waktu yang valid.
AB
@strawberrie Skrip saya diubah
AB
1

NASKAH

Ini adalah versi naskah asli saya yang diedit. OP awalnya tidak memberikan informasi lengkap tentang format penamaan. Skrip ini menyesuaikan dengan apa yang disebutkan OP dalam komentar adalah penamaan file yang benar.

* Catatan teknis: *

Dalam skrip ini kami memisahkan nama file menjadi 6 bidang terpisah menggunakan awk, dengan garis bawah sebagai pembatas bidang. Dua bidang pertama, $ 1 dan $ 2 dianggap string teks statis. Kolom 3,4,5, dan 6 adalah stempel waktu saat sampel OP diambil, bukan tanggal pembuatan file pada sistem file.

Variabel COPYDIR menyimpan nama direktori baru tempat file dengan timestamp yang diperbarui akan muncul. Kami membuat direktori itu di direktori kerja saat ini denganmkdir $COPYDIR

Variabel TEXTSTRING dan DATESTRING memegang teks statis dan cap waktu dengan hormat. Dalam contoh output di bawah ini saya telah menggunakan dua string yang berbeda untuk membuktikan bahwa skrip akan berfungsi terlepas dari teks apa yang dipegang oleh dua bidang pertama.

NEWEPOCHTIME adalah variabel yang menyimpan timestamp baru yang dihitung dalam format unix epoch. NEWDATE adalah variabel yang menyimpan timestamp yang dikonversi dari zaman unix ke format YYYY-MM-DD HH: MM. NEWAPPEND adalah cap waktu aktual yang akan ditambahkan ke file dalam format YYYY_MM_DD_HHMM yang diinginkan OP.

cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".dat menyalin file lama ke direktori "convert_files" (alih-alih bergerak, untuk mencegah kehilangan data) dengan datastamp yang diperbarui.

Perhatikan , skrip akan berfungsi selama format penamaan benar - benar diikuti, yaitu semua file benar - benar memiliki SomeText_123.Data_YYYY_MM_DD_HHMM.datformat.

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

TULISAN AKSI

Demonstrasi di bawah ini adalah salinan langsung dari terminal saya. Perhatikan bahwa saya telah membuat file asli dengan dua string berbeda di dua bidang pertama. Jadi skrip ini harus bekerja tidak peduli apa yang ada di awal nama file, selama hanya ada dua string yang dipisahkan oleh garis bawah

Naskah itu dinamai notes-conversionkarena saya mengembangkan naskah dari catatan yang saya ambil saat mengerjakan pertanyaan ini.

Perhatikan bahwa nama file yang memiliki bagian HHMM sebagai 2345 (yaitu 15 menit sebelum tengah malam) diperbarui ke 0015, dan bagian DD diperbarui ke hari berikutnya. Format 24 jam dipertahankan.

Selain itu, karena untuk loop hanya mencari .datfile, kami menghindari mengganti nama file atau direktori lain yang mungkin ada di direktori kerja, sehingga menghindari kemungkinan hilangnya data. Dalam contoh di bawah, direktori asli menampung 11 item, 3 di antaranya adalah *.txtfile untuk pengujian, jadi kami hanya bekerja dengan 8 .datfile. Di direktori tempat file yang diperbarui, kami melihat 8 file, semua .datdan tidak ada file lainnya. Data aman, skrip melakukan tugasnya.

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

PENJELASAN (dari pos asli)

*) Hari ini saya telah belajar bahwa sistem Unix-Linux menghitung waktu dalam waktu Epoch , atau hanya meletakkan detik.

*) skrip mengambil setiap nama file, mengekstrak tanggal, mengubahnya menjadi zaman, menambahkan 1800 detik (tepatnya 30 menit), dan menyimpan file dengan timestamp baru.

*) Skrip ini membahas apa yang diinginkan OP - ubah stempel waktu dalam nama file, bukan perbarui waktu pembuatan file itu sendiri

Alat yang digunakan:

  • ubuntu 15.04

  • GNU bash 4.3.30

  • GNU awk 4.1.1

  • date (GNU coreutils) 8.23

Sergiy Kolodyazhnyy
sumber
omong-omong, ls | wc -l sebelum memberikan 36 file, dan setelah skrip juga 36 file, tidak ada yang hilang
Sergiy Kolodyazhnyy
Juga, alasan mengapa saya menggunakan file stat -c% n, karena parsing output ls bukan ide yang baik, secara umum. Beberapa orang menggunakan findperintah, yang juga bagus.
Sergiy Kolodyazhnyy
Terima kasih @erg. Saya tidak tahu mengapa saya hanya meninggalkan 2 dari 727 file yang tersisa di folder setelah menjalankan skrip Anda ...
strawberrie
Apakah ada perbedaan antara nama file aktual dan contoh yang Anda kirim?
Sergiy Kolodyazhnyy
juga, apakah Anda menjalankan baris pertama dalam "Script in action"? rm * adalah untuk membersihkan direktori saya sendiri dan kemudian membuat banyak file uji dengan tanggal berbeda dalam nama file. Anda tidak seharusnya menjalankan itu
Sergiy Kolodyazhnyy
-1

Anda dapat menggunakan kode ini untuk melakukan apa yang Anda anggap perlu

  1. Anda harus mengambil cadangan dan menguji kode terlebih dahulu untuk melihat apakah itu cocok untuk kasus Anda
  2. Anda menggunakan format 24H
  3. tidak ada file yang akan dinamai setelah 23:29 (jika Anda memiliki file setelah waktu itu kode juga harus diubah untuk mengubah tanggal)

kodenya adalah:

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 ;

Cara kerjanya: Kode akan memeriksa menit bagian dalam nama file MMmaka jika kurang dari 30 akan menambah 30 MMjika sama dengan 30 atau lebih itu akan menambah 1 jam ke HHbagian dalam nama dan mengurangi 30 menit dari MMbagian dari nama

Pikiran Gemuk
sumber
untuk pemilih bawah tolong beri tahu alasannya?
Fat Mind