У мене є імена файлів 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
?