Mam nazwy plików danych w kolejności chronologicznej:
FileName_YYYY_MM_DD_HHMM.dat
Czy są jakieś polecenia dodawania 30 minut do każdego znacznika czasu?
command-line
filename
timestamp
strawberrie
źródło
źródło
ls --full-time
?Odpowiedzi:
Używanie
python
:os.chdir('/path/to/dir')
zmieni bieżący katalog na katalog zawierający.dat
pliki. Zamień/path/to/dir
na rzeczywistą ścieżkę.glob.glob('*.dat')
znajdzie pliki kończące się na.dat
ini_time
zmienna najpierw wycina datę i czas z oryginalnej nazwy pliku za pomocąre
modułu, a następnie sortuje, który wpis reprezentuje to, co w łańcuchu, który jest usuwany, abyśmy mogli dodać do tego wymagany czasfin_time
będzie zawierać wynikowy czas, tj.ini_time
plus 30 minutos.rename
odpowiednio zmieni nazwę pliku.Zauważ też, że przy kolejnych nazwach plików (różniących się o 30 minut) plik o zmienionej nazwie zastąpi następny, dlatego lepiej jest dodać sekundy do nazwy o zmienionej nazwie, aby zachować bezpieczeństwo. W przeciwnym razie należy zapisać pliki o zmienionej nazwie w innym katalogu, a następnie zastąpić je oryginalnymi plikami później.
źródło
Filename_
w metodzie zmiany nazwy./path/to/file
pełną ścieżkę do katalogu?Za
bash
pomocą pliki o zmienionej nazwie znajdują się w nowym podfolderzerenamed
.Uruchom skrypt w folderze, w którym znajdują się pliki.
przykładowe dane wyjściowe:
źródło
renamed
FileName_123.Data_YYYY_MM_DD_HHMM.dat
części.Data_YYYY_MM_DD_HHMM.dat
jest rozszerzeniem. I dlategoFileName_123
nie jest prawidłowym znacznikiem czasu.SCENARIUSZ
To jest zredagowana wersja mojego oryginalnego skryptu. OP początkowo nie dostarczył pełnych informacji o formacie nazewnictwa. Ten skrypt dostosowuje się do tego, co OP wspomniane w komentarzach było prawidłowym nazewnictwem plików.
* Uwagi techniczne: *
W tym skrypcie rozdzielamy nazwę pliku na 6 oddzielnych pól za pomocą awk, z podkreślnikiem jako ogranicznikiem pola. Pierwsze dwa pola, 1 $ i 2 $, są traktowane jako ciąg tekstowy. Pola 3,4,5 i 6 to znacznik czasu, w którym próbkowane były dane OP, a nie data utworzenia pliku w systemie plików.
Zmienna COPYDIR zawiera nazwę nowego katalogu, do którego trafią pliki ze zaktualizowanym znacznikiem czasu. Tworzymy ten katalog w bieżącym katalogu roboczym za pomocą
mkdir $COPYDIR
Zmienne TEXTSTRING i DATESTRING przechowują odpowiednio tekst statyczny i znacznik czasu. W poniższym przykładzie wyjściowym użyłem dwóch różnych ciągów, aby udowodnić, że skrypt będzie działał niezależnie od tego, jaki tekst zawierają dwa pierwsze pola.
NEWEPOCHTIME jest zmienną, która przechowuje obliczony nowy znacznik czasu w formacie epoki uniksowej. NEWDATE jest zmienną, która przechowuje konwertowany znacznik czasu z epoki uniksowej na format RRRR-MM-DD GG: MM. NEWAPPEND to rzeczywisty znacznik czasu, który zostanie dodany do pliku w pożądanym formacie YYYY_MM_DD_HHMM PO.
cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".dat
kopiuje stary plik do katalogu „przekonwertowane pliki” (zamiast przenosić, aby zapobiec utracie danych) za pomocą zaktualizowanego znacznika danych.Wskazówki , skrypt będzie działać tak długo, jak format nazewnictwa jest rzeczywiście następuje, czyli wszystkie pliki są naprawdę mieć
SomeText_123.Data_YYYY_MM_DD_HHMM.dat
format.PISMO W AKCJI
Poniższa demonstracja jest bezpośrednią kopią z mojego terminalu. Zauważ, że utworzyłem oryginalne pliki z dwoma różnymi ciągami w pierwszych dwóch polach. Więc ten skrypt powinien działać bez względu na to, co jest na początku nazwy pliku, o ile tak naprawdę są tylko dwa ciągi znaków oddzielone znakiem podkreślenia
Skrypt został nazwany,
notes-conversion
ponieważ opracowałem go na podstawie notatek, które sporządziłem podczas pracy nad tym pytaniem.Zauważ, że nazwy plików, które mają część HHMM jako 2345 (czyli 15 minut przed północą), są aktualizowane do 0015, a część DD jest aktualizowana do następnego dnia. Zachowano format 24-godzinny.
Ponadto, ponieważ dla pętli szuka tylko
.dat
plików, unikamy zmiany nazw innych plików lub katalogów, które mogą znajdować się w katalogu roboczym, co pozwala uniknąć potencjalnej utraty danych. W poniższym przykładzie oryginalny katalog zawiera 11 elementów, z których 3 to*.txt
pliki do testowania, więc pracujemy tylko z 8.dat
plikami. W katalogu, do którego trafiają zaktualizowane pliki, widzimy 8 plików, wszystkie.dat
i żadnych innych plików. Dane są bezpieczne, skrypt spełnia swoje zadanie.WYJAŚNIENIE (z oryginalnego postu)
*) Dzisiaj dowiedziałem się, że systemy Unix-Linux liczą czas w epoce lub po prostu umieszczają sekundy.
*) skrypt pobiera każdą nazwę pliku, wyodrębnia datę, konwertuje ją do epoki, dodaje 1800 sekund (dokładnie dokładnie 30 minut) i zapisuje plik z nową datą.
*) Ten skrypt dotyczy tego, czego chciał OP - zmień znacznik czasu w nazwie pliku, a nie aktualizuj czasu utworzenia samego pliku
Narzędzia użyte:
ubuntu 15.04
GNU bash 4.3.30
GNU awk 4.1.1
data (GNU coreutils) 8.23
źródło
find
polecenia, co jest również dobre.Możesz użyć tego kodu do zrobienia tego, czego potrzebujesz
kod to:
Jak to działa: kod sprawdzi część minut w nazwie pliku,
MM
a jeśli jest mniejsza niż 30, doda 30 do,MM
jeśli jest równa 30 lub więcej, doda 1 godzinę doHH
części w nazwie i odejmie 30 minut odMM
część nazwyźródło