У мене є імена файлів dat у хронологічному порядку:
FileName_YYYY_MM_DD_HHMM.dat
Чи є команди для додавання 30 хвилин до кожної мітки часу?
У мене є імена файлів dat у хронологічному порядку:
FileName_YYYY_MM_DD_HHMM.dat
Чи є команди для додавання 30 хвилин до кожної мітки часу?
Відповіді:
Використання 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_timeплюс 30 хвилин
os.rename перейменує файл відповідно.
Також зауважте, що при послідовних іменах файлів (різниться 30 хвилин) перейменований файл замінить наступний, отже, краще додати ім'я перейменованого файлу до секунд, щоб він залишався в безпеці. Інакше вам потрібно зберегти перейменовані файли в інший каталог, а потім замінити їх на вихідні.
Filename_у методі перейменування.
/path/to/fileповний шлях до каталогу?
Використовуючи 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
renamed
FileName_123.Data_YYYY_MM_DD_HHMM.datчастини .Data_YYYY_MM_DD_HHMM.dat- це розширення. Тому FileName_123не є дійсною міткою часу.
СКРИПТ
Це відредагована версія мого оригінального сценарію. ОР спочатку не надало повної інформації про формат іменування. Цей скрипт адаптується до того, що в коментарях, зазначених в ОП, було правильне іменування файлів.
* Технічні примітки: *
У цьому скрипті ми розділяємо ім'я файлу на 6 окремих полів за допомогою awk, з підкресленням як роздільник поля. Перші два поля, $ 1 і $ 2, вважаються статичним текстовим рядком. Поля 3,4,5 та 6 є часовою позначкою, в яку відбирали вибіркові дані ОП, а не дата створення файлу у файловій системі.
Змінна COPYDIR містить ім'я нового каталогу, куди будуть переходити файли з оновленою часовою міткою. Ми створюємо цей каталог у поточному робочому каталозі зmkdir $COPYDIR
Змінні TEXTSTRING та DATESTRING містять статичний текст та часові позначки відповідно. У наведеному нижче прикладі я використав два різні рядки, щоб довести, що сценарій буде працювати незалежно від того, який текст містить перші два поля.
NEWEPOCHTIME - це змінна, яка містить обчислені нові часові позначки у форматі unix epoch. NEWDATE - це змінна, яка містить перетворені часові позначки від unix епохи до YYYY-MM-DD HH: MM формат. NEWAPPEND - це фактична мітка часу, яка буде додана у файл у бажаному форматі YYYY_MM_DD_HHMM OP.
cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".dat копіює старий файл у каталог "conver_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
СКРИПТ В ДІЙ
Наведена нижче демонстрація - це пряма копія з мого терміналу. Зауважте, що в перших двох полях я створив оригінальні файли з двома різними рядками. Отже, цей сценарій повинен працювати незалежно від того, що знаходиться на початку імені файлу, якщо дійсно є лише два рядки, розділені підкресленням
Сценарій був названий notes-conversionтому, що я розробив сценарій із заміток, які я взяв під час роботи над цим питанням.
Зверніть увагу, що назви файлів, які містять HHMM як 2345 (що за 15 хвилин до півночі), оновлюються до 0015, а частина DD оновлюється до наступного дня. Зберігається формат 24 години.
Крім того, оскільки цикл шукає лише .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 рахують час у епоху часу , або просто кладуть секунди.
*) скрипт бере кожне ім'я файлу, витягує дату, перетворює його в епоху, додає 1800 секунд (що рівно 30 хвилин) і зберігає файл із новою часовою міткою.
*) Цей скрипт стосується того, що хотів ОП - зміни часової позначки у назві файлу, а не оновлення часу створення самого файлу
Використовувані інструменти:
ubuntu 15.04
GNU bash 4.3.30
GNU awk 4.1.1
дата (GNU coreutils) 8.23
findкоманду, що також добре.
Ви можете використовувати цей код, щоб робити те, що потрібно припускати
код такий:
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 ;
Як це працює:
Код перевіряє хвилинну назву файлу, MMтоді, якщо вона менша за 30, вона додасть 30 до, MMякщо вона дорівнює 30 і більше, вона додасть 1 годину до HHчастини в імені і відрахує 30 хвилин MMчастина назви
ls --full-time?