У меня есть имена файлов в хронологическом порядке:
FileName_YYYY_MM_DD_HHMM.dat
Есть ли команды для добавления 30 минут к каждой отметке времени?
command-line
filename
timestamp
strawberrie
источник
источник
ls --full-time
?Ответы:
Использование
python
: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
.Запустите скрипт в папке, где находятся файлы.
пример вывода:
источник
renamed
FileName_123.Data_YYYY_MM_DD_HHMM.dat
части.Data_YYYY_MM_DD_HHMM.dat
это расширение. И, следовательноFileName_123
, не является действительной отметкой времени.SCRIPT
Это отредактированная версия моего оригинального сценария. Первоначально ОП не предоставил полную информацию о формате имен. Этот скрипт адаптируется к тому, что OP, упомянутый в комментариях, был правильным именованием файлов.
* Технические примечания: *
В этом сценарии мы разделяем имя файла на 6 отдельных полей, используя awk, с подчеркиванием в качестве разделителя полей. Первые два поля, $ 1 и $ 2, считаются статической текстовой строкой. Поля 3, 4, 5 и 6 - это отметка времени, в которую были взяты данные OP, а не дата создания файла в файловой системе.
Переменная COPYDIR содержит имя нового каталога, куда будут отправляться файлы с обновленной отметкой времени. Мы создаем этот каталог в текущем рабочем каталоге с
mkdir $COPYDIR
Переменные TEXTSTRING и DATESTRING содержат статический текст и метку времени соответственно. В приведенном ниже примере вывода я использовал две разные строки, чтобы доказать, что скрипт будет работать независимо от того, какой текст содержат первые два поля.
NEWEPOCHTIME - это переменная, которая содержит вычисленную новую метку времени в формате эпохи Unix. NEWDATE - это переменная, которая содержит преобразованную метку времени из эпохи Unix в формат ГГГГ-ММ-ДД ЧЧ: ММ. NEWAPPEND - это фактическая временная метка, которая будет добавлена в файл в желаемом формате OP YYYY_MM_DD_HHMM.
cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".dat
копирует старый файл в каталог "convert_files" (вместо перемещения, чтобы предотвратить потерю данных) с обновленной меткой данных.Обратите внимание , что скрипт будет работать до тех пор, пока формат имен действительно соблюдается, т. Е. Все файлы действительно имеют
SomeText_123.Data_YYYY_MM_DD_HHMM.dat
формат.СЦЕНАРИЙ В ДЕЙСТВИИ
Демонстрация ниже - прямая копия с моего терминала. Обратите внимание, что я создал оригинальные файлы с двумя разными строками в первых двух полях. Таким образом, этот скрипт должен работать независимо от того, что находится в начале имени файла, если на самом деле только две строки разделены подчеркиванием
Сценарий был назван
notes-conversion
потому, что я разработал сценарий из заметок, которые я сделал, работая над этим вопросом.Обратите внимание, что имена файлов, которые имеют часть ЧЧММ как 2345 (то есть за 15 минут до полуночи), обновляются до 0015, а часть DD обновляется до следующего дня. 24-часовой формат сохранен.
Кроме того, поскольку цикл for ищет только
.dat
файлы, мы избегаем переименования других файлов или каталогов, которые могут оказаться в рабочем каталоге, что позволяет избежать любой потенциальной потери данных. В приведенном ниже примере оригинальный каталог содержит 11 элементов, 3 из которых -*.txt
файлы для тестирования, поэтому мы работаем только с 8.dat
файлами. В каталоге, где находятся обновленные файлы, мы видим 8 файлов, и все.dat
остальные файлы отсутствуют. Данные в безопасности, скрипт выполняет свою работу.ОБЪЯСНЕНИЕ (из оригинального поста)
*) Сегодня я узнал, что системы Unix-Linux считают время в эпоху , или, проще говоря, секунды.
*) скрипт берет каждое имя файла, извлекает дату, конвертирует ее в эпоху, добавляет 1800 секунд (что составляет ровно 30 минут) и сохраняет файл с новой отметкой времени.
*) Этот скрипт обращается к тому, что хотел OP - изменяет временную метку в имени файла, а не обновляет время создания самого файла
Используемые инструменты:
Ubuntu 15.04
GNU bash 4.3.30
GNU awk 4.1.1
дата (GNU coreutils) 8,23
источник
find
команду, что тоже хорошо.Вы можете использовать этот код, чтобы делать то, что вам нужно, предполагая,
код:
Как это работает: код проверяет часть минут в имени файла,
MM
затем, если он меньше 30, он прибавляет 30 к,MM
если он равен 30 или более, он добавляет 1 час кHH
части имени и вычитает 30 минут изMM
часть имениисточник