Як я можу змінити часову позначку імені файлу?


8

У мене є імена файлів dat у хронологічному порядку:

FileName_YYYY_MM_DD_HHMM.dat

Чи є команди для додавання 30 хвилин до кожної мітки часу?


1
чи ті часові позначки збігаються з датою їх створення? це те саме, що ls --full-time?
Сергій Колодяжний

1
Ні, часові позначки відрізняються від дати їх створення / зміни. Часові позначки засновані на часі вимірювання даних.
strawberrie

1
Дивіться, оскільки ці часові позначки є звичайними, потрібен буде сценарій, який повинен обчислити додавання 30 хвилин до дати, не буде простої команди. тож люди можуть зайняти трохи реакції
Сергій Колодяжний

1
чи є позначки часу, які близькі до півночі, так що додавання 30 хвилин може призвести до необхідності змінити день на одну?
Сергій Колодяжний

1
який формат годин? 12, то 1,2,3 (формат 12 годин) або 12-13-14, 15. . . 23, 00 (формат 24 години)?
Сергій Колодяжний

Відповіді:


6

Використання 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 хвилин) перейменований файл замінить наступний, отже, краще додати ім'я перейменованого файлу до секунд, щоб він залишався в безпеці. Інакше вам потрібно зберегти перейменовані файли в інший каталог, а потім замінити їх на вихідні.


Ти і пітон, велике кохання. =) +1
AB

Не слід використовувати рядок Filename_у методі перейменування.
AB

@AB Чому це? (+1 теж для вас)
heemayl

Чи знаєте ви, чому після запуску сценарію python у мене відсутні деякі файли? Мітка часу для кожного файлу має 30-хвилинну різницю. Нижче наведено вихід для перших кількох імен файлів: ім'я файлу_2011_01_11_1630.dat ім'я файлу_2011_01_11_1830.dat ім'я файлу_2011_01_11_1900.dat ім'я файлу_2011_01_11_2030.dat ім'я файлу_2011_01_11_2100.dat
соломерія 21

@strawberrie я не знаю .. це я протестував і добре працював для мене без проблем. Ви запускаєте сценарій, замінюючи /path/to/fileповний шлях до каталогу?
heemayl

2

Використовуючи 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

@strawberrie перейменовані файли тепер розміщуються в підпапкахrenamed
AB

хороша ідея зберегти перейменовані файли в додаткову папку. У випадку, якщо щось піде не так, OP все ще має оригінали. Добре подумайте, отже +1
Сергій Колодяжний

Дякую @AB. Після запуску вашого сценарію я отримав таку помилку: TimeChange.sh: 21: TimeChange.sh: Неправильна підміна Моє власне ім'я файлу або фіксований префікс перед часовою позначкою схоже на FileName_123.Data_YYYY_MM_DD_HHMM.dat
strawberrie

За визначенням, для FileName_123.Data_YYYY_MM_DD_HHMM.datчастини .Data_YYYY_MM_DD_HHMM.dat- це розширення. Тому FileName_123не є дійсною міткою часу.
AB

@strawberrie У мене змінили сценарій
AB

1

СКРИПТ

Це відредагована версія мого оригінального сценарію. ОР спочатку не надало повної інформації про формат іменування. Цей скрипт адаптується до того, що в коментарях, зазначених в ОП, було правильне іменування файлів.

* Технічні примітки: *

У цьому скрипті ми розділяємо ім'я файлу на 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


до речі, лс | wc -l раніше видає 36 файлів, а після скрипта також 36 файлів, жодного не вистачає
Сергій Колодяжний

Крім того, причина, чому я використовую файл stat -c% n, полягає в тому, що аналіз синтаксису ls - це не дуже добра ідея. Деякі люди використовують findкоманду, що також добре.
Сергій Колодяжний

Дякую @Serg Я не знаю, чому після запуску вашого сценарію у папці залишилось 2 із 727 файлів, які залишились у папці ...
strawberrie

Чи була різниця між власне іменами файлів та прикладом, який ви опублікували?
Сергій Колодяжний

також, ви запустили перший рядок у "Сценарії в дії"? rm * призначений для очищення мого власного каталогу, а потім створення купи тестових файлів з різними датами у назвах файлів. Ви не мали цього бігати
Сергій Колодяжний

-1

Ви можете використовувати цей код, щоб робити те, що потрібно припускати

  1. спершу слід взяти резервну копію та перевірити код, щоб перевірити, чи підходить він у вашому випадку
  2. ви використовуєте формат 24H
  3. жодні файли не будуть названі іменем 23:29 (якщо у вас є файли після цього часу, код слід змінити і для зміни дати)

код такий:

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частина назви


для виборця, будь ласка, повідомте про причину?
Жирний розум
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.