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?
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?
Jawaban:
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 .dat
file. Ganti /path/to/dir
dengan jalur yang sebenarnya.
glob.glob('*.dat')
akan menemukan file yang berakhiran .dat
ini_time
variabel pada awalnya akan memotong tanggal-waktu dari nama file asli menggunakan re
modul dan kemudian memilah entri yang mewakili apa yang ada di string yang diambil sehingga kita dapat menambahkan waktu yang diperlukan untuk ini
fin_time
akan berisi waktu yang dihasilkan yaitu ini_time
ditambah 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.
Filename_
dalam metode rename.
/path/to/file
dengan path lengkap ke direktori?
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
renamed
FileName_123.Data_YYYY_MM_DD_HHMM.dat
bagiannya .Data_YYYY_MM_DD_HHMM.dat
adalah ekstensi. Dan karenanya FileName_123
bukan cap waktu yang valid.
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.dat
format.
#!/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-conversion
karena 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 .dat
file, 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 *.txt
file untuk pengujian, jadi kami hanya bekerja dengan 8 .dat
file. Di direktori tempat file yang diperbarui, kami melihat 8 file, semua .dat
dan 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
find
perintah, yang juga bagus.
Anda dapat menggunakan kode ini untuk melakukan apa yang Anda anggap perlu
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 MM
maka jika kurang dari 30 akan menambah 30 MM
jika sama dengan 30 atau lebih itu akan menambah 1 jam ke HH
bagian dalam nama dan mengurangi 30 menit dari MM
bagian dari nama
ls --full-time
?