Как добавить к имени файла дату
Я пытаюсь добавить текущую дату в конец имени файла следующим образом:
Вот что у меня так далеко:
Однако все, что я получаю, это имя файла, и оно ничего не добавляет. Как добавить текущую дату к имени файла?
Более чем вероятно, это ваше использование set . Это назначит 'today', '=' и вывод date программы позиционным параметрам (или аргументам командной строки). Вы хотите просто использовать оболочку C (которую вы помечаете как «bash», так что скорее всего нет), вы захотите использовать:
Обратите внимание на отсутствие пробелов вокруг знака равенства.
Вы также не хотите использовать & в конце ваших утверждений; что заставляет оболочку не ждать завершения команды. Особенно, когда один полагается на следующий. Команда find может потерпеть неудачу, потому что она запускается до mkdir .
Спасибо за этого приятеля, теперь он работает на 100% нормально, привет за хедз-ап и и MkDirСкрипт Bash для вставки даты в имя файла:
Этот код Bash в файле называется a.sh
При запуске печатает:
Пояснение к коду:
Интерпретируйте скрипт с помощью интерпретатора / bin / bash. Создайте новую переменную с именем today. Выполните команду date, передав флаги Y, m, d, H, M, S для настройки вывода. Поместите результат в переменную даты.
Создайте новую переменную с именем filename, окружите переменную $ today остальным текстом статического имени файла. затем введите имя файла на экран.
Втирайте его в однострочник, чтобы увеличить lulz:
Вы, кажется, перепутали несколько вещей.
set today = 'date +%Y' выглядит как синтаксис tcsh, но даже в tcsh он присваивает строку date +%Y переменной today , он не запускает date команду. Поскольку вы, вероятно, используете bash или какую-либо другую оболочку POSIX, синтаксис присваивания today=some_value (без пробелов вокруг знака равенства). Чтобы запустить команду и назначить ее вывод переменной, используйте подстановку команды :
(Я также завершил спецификацию даты). Вы можете использовать обратные кавычки вместо долларовых скобок, но это может привести к тому, что они будут визуально перепутаны с прямыми кавычками, а правила, когда вам нужны кавычки внутри команды с обратными кавычками, довольно сложны и зависят от реализации, поэтому лучше не придерживаться $(…) (что имеет тот же эффект с более разумным синтаксисом).
Вы использовали & в конце несколько команд. Это заставляет команду выполняться в фоновом режиме, что здесь не нужно. Я подозреваю, что вы имели в виду && , что означает выполнение следующей команды, только если первая команда прошла успешно.
Альтернативой использованию && после каждой команды является запуск вашего скрипта set -e . Это говорит оболочке прекратить выполнение скрипта, как только любая команда вернет ненулевой статус (за исключением команд в if условиях и нескольких других случаях).
Ваша find команда в порядке, но, вероятно, не делает то, что вы собираетесь делать (хотя я не знаю точно, что это такое).
Вы создаете каталог с помощью, mkdir а затем сразу же просматриваете его find . Это не будет полезно, если каталог уже существует. Вы имели в виду создать каталог для сегодняшних журналов и переместить последние файлы из The_Logs каталога под названием, например The_Logs.2012-02-11 ?
Или вы хотели переименовать сегодняшние файлы журналов, чтобы добавить суффикс $today ? Это требует вычисления разных имен файлов для каждого файла для перемещения.
Обратите внимание, что я использовал -mtime для перемещения файлов в зависимости от времени их изменения, а не -atime от времени последнего чтения файла (если ваша система отслеживает это, а если нет, то время может быть уже как время изменения).
На днях мне пришлось решить небольшую задачку по наименованию резервных копий, наименование которых должно было содержать дату в формате yymmdd (две последних цифры года, две цифры месяца и две цифры дня). Используемая для создания резервных копия утилита, однако, такой формат даты в имени не поддерживает. Но поддерживает запуск исполняемых файлов до и/или после процедуры копирования. Поэтому решением стал cmd-файл (ну или bat, как вариант). Вот его пример:
Конечно, я заменил реальные имена файлов на условные. Теперь разберем что к чему. Сразу оговорюсь, что примеры в основном будут касаться файлов, но логика работы с каталогами точно такая же.
Для перевода дат в именах файлов я использовал значение текущей даты в Windows, которое записывается в виде dd.mm.yyyy. При этом отметим, что эта дата это десять символов (точки считаются), которые пронумерованы системой начиная с нуля.
создаёт переменную CURDATE (от current date) и задаёт ей значение текущей даты. Имя переменной можно выбрать произвольно, хватит и любой буквы. Кроме того, переменную можно специально и не задавать, а использовать текущую дату. Но об этом позднее.
Далее идёт команда переименования ren (или rename ). Можно использовать оба варианта написания команды. Синтаксис её выглядит так:
ren [путь_к_файлу]\[старое_имя_файла] [новое_имя_файла]
Ограничением команды rename является то, что при переименовании нельзя указать новый путь к файлу. То есть это именно переименование, а не копирование с новым именем и не перемещение с переименованием. Но, так как мне нужно было только переименовать файлы, этот вариант подходил. Далее также разберем и другие команды.
Теперь непосредственно о команде переименования:
Как видим, мы берем файл primer_%date%.zip из каталога C:\Backups\ для переименования. Например, созданный сегодня файл будет иметь имя primer_07.11.2018.zip, а завтрашний primer_08.11.2018.zip. В нашем случае это ежедневные резервные копии. Новое имя, возможно, выглядит страшно и требует расшифровки.
Напомню, что CURDATE представляет собой последовательность из десяти символов, пронумерованных от нуля до девяти, и в общем виде представляет собой текущую дату в виде dd.mm.yyyy. Таким образом, в нашем примере:
В итоге, файл primer_07.11.2018.zip превращается в d_181107_primer.zip. Что касается буквы d, то это просто указатель ежедневной копии, который я оставил в примере, чтобы показать, что можно спокойно дописывать любые символы до и после формируемой нами даты.
В конце скрипта очистим значение CURDATE
Переменную можно было и не задавать. Тогда бы мы обошлись одной строкой:
С другой стороны, если Вам не чуждо написание сложных команд, то лучше сразу заиметь привычку оперировать собственными переменными.
Как я уже говорил, вы можете записывать дату в имени файла по своему усмотрению не только при переименовании. Например, команда для создания каталога mkdir (или md ):
Здесь мы обозвали переменную не CURDATE , а просто a . Второй командой мы создали на диске C каталог с именем вида mmdd (месяц, день).
Переименование можно делать и командой move .
Этими командами мы переименовали файл primer.txt в текущем каталоге в файл primer_07_11_2018.txt (при другой дате на календаре, конечно, будет другое имя). Думаю, синтаксис уже должен быть вам понятен: два символа с нулевого, два символа с третьего и четыре с шестого.
Но, вообще, команда move это, конечно, больше про перемещение файлов и папок. Конечно же, задавать имена с датой в любом формате можно и при перемещении.
Кстати, в самом первом примере мы находили нужным нам файл с датой в имени, которая была записана в правильной по российским нормам последовательности dd.mm.yyyy, но ведь она может быть записана и другим способом. Что если в имени файла у нас только месяц и последние две цифры года? А мы хотим поставить сначала год, потом месяц, да ещё и разделить их символом _ для лучшей читаемости.
Как и в команде move , если путь к файлу или каталогу не задан явно, речь идёт о текущем каталоге. Ну и не забывайте очищать значение переменной (на самом деле, переменные, задаваемые командой set , действуют только на протяжении командной сессии, в которой они были заданы 😉 ).
d2 - имя диска из второго аргумента вызова .bat-ника
%
p2 - путь из второго аргумента
%
n1 - имя файла из первого аргумента
%CURDATE:
x1 - расширение файла из первого аргумента
кавычки - чтобы избежать потенциальных проблем с путями, содержащими пробелы.
move /Y - перемещение файла, подавление запроса на перезапись существующего.
set CURDATE= - очистка переменной.
Недостаток: привязка к формату даты.
0,2%% этим как раз присваивается год месяц день, про очистку переменной поняла, и чувствую интуитивно что где-то вот здесь move /Y %1 "%
В том варианте, что есть, надо вызывать .bat-ник с соответствующими параметрами, т.е.:
имя.bat E:\Temp\CopyData\bukv.doc путь_куда_переносить\
Если хотите получить дату в начале нового имени, %CURDATE:
0,2% надо поменять местами с %
Вызов .bat-файла:
имя.bat E: \Temp\CopyData\ bukv .doc D: \Archives\ и неявный аргумент - дата: 16 . 02 .20 07
Во что развернётся переделанный вызов команды move /Y %1 " %
move /Y E: \Temp\CopyData\ bukv .doc " D: \Archives\ 07 02 16 bukv .doc "
Если же название файла и пути известны заранее, и нет нужды передавать их в .bat как аргументы, то можно прописать составные части явно:
move /Y E:\Temp\CopyData\bukv.doc D:\Archives\%CURDATE:
0,2%bukv.doc
или
copy /Y E:\Temp\CopyData\bukv.doc D:\Archives\%CURDATE:
В том варианте, что есть, надо вызывать .bat-ник с соответствующими параметрами, т.е.:
имя.bat E:\Temp\CopyData\bukv.doc путь_куда_переносить\
Если хотите получить дату в начале нового имени, %CURDATE:
0,2% надо поменять местами с %
Вызов .bat-файла:
имя.bat E: \Temp\CopyData\ bukv .doc D: \Archives\ и неявный аргумент - дата: 16 . 02 .20 07
Во что развернётся переделанный вызов команды move /Y %1 " %
move /Y E: \Temp\CopyData\ bukv .doc " D: \Archives\ 07 02 16 bukv .doc "
0,2%
Например, запускать cmd-файл много раз в день, но выполнять только в первый раз (используется флаг 2018.02.19.done):
0,2%|clip В буфер обмена.
Напишите в каком приложении и редактировать эти параметры .Непонятно начало действий. regedit ? где сохранить этот командный файлюWin 7
Я создал сurrentdata.cmd, запускаю,вижу чёрное окошко(могу разобрать там что-то "ошибка"). Всё.
0,2%|clip без ошибок. Запускаете, дата в буфере обмена.
вместо строчки SET DT=%date:
эту вставить ли? echo %date:
Результат положительный, спасибо. Но очень небрежные и поэтому невнятные описания. Друзья, когда пишите их - не кодируйте пожалуйста! Можно немного автоматизировать, добавив (или изменив имеющийся) диалог в контекстное меню папок (можно даже для конкретной папки):Добавляет новый пункт в контекстное меню папок.
HKLM\SOFTWARE\Classes\Directory\shell
В этом разделе необходимо создать новый ключ, например:
HKLM\SOFTWARE\Classes\Directory\shell\Far Manager
В значении по умолчанию укажите название программы, например "Far manager", далее необходимо создать подключ с названием "command", например:
HKLM\SOFTWARE\Classes\Directory\shell\Far Manager\command
В значении по умолчанию укажите путь к файлу с параметрами при необходимости, например:
c:\program files\far\far.exe %1
Либо создать свою папку для всего этого дела и создавать нужные папки только внутри неё, а для корневой настроить сортировку по дате, добавить (или перенастроить) столбцы как удобно.
Можно создать новый диалог создания файла, достаточно записать имя файла в виде:
имя_файла_%date%.txt
Собственно дата в свойствах файла для того и нужна, мало того - их там две - создания и изменения (есть ещё последнего доступа и кажется, ещё какие-то). Потому что имя файла это имя, а не дата.
я сжимаю файлы с помощью WinZip в командной строке. Поскольку мы архивируем ежедневно, я пытаюсь добавить дату и время в эти файлы, чтобы каждый раз автоматически создавался новый.
я использую для создания имени файла. Скопируйте вставьте его в командную строку, и вы увидите имя файла с компонентом даты и времени.
однако, моя проблема AM vs PM. Штамп времени AM дает мне время 9 (с ведущим пробелом) против 10 естественно, занимая два места.
Я думаю, что моя проблема будет распространяться на первые девять дней, первые 9 месяцев и т. д. также.
это немного сложнее, потому что он работает только с полными путями, wmic ожидает, что обратные косые черты будут удвоены и = должен быть спасен (первый. Второй защищен окружающие цитаты).
извлеките час, найдите начальное пространство, если найдено заменить на ноль;
вы должны искать, вы можете просто заменить все пробелы с нуля set hr=%hr: =0% -джеб 11 октября в 14: 16
затем использовать %hr% внутри любой строки форматировании всегда получит двузначное час.
(комментарий Джеба под самым популярным ответом работал лучше всего для меня и является самым простым. Я перепечатываю его здесь, чтобы сделать его более очевидным для будущего пользователи.)
как уже указала Вики, %DATE% и %TIME% верните текущую дату и время, используя короткие форматы даты и времени, которые полностью (бесконечно) настраиваются.
один пользователь может настроить свою систему для возврата Fri040811 08.03 PM в то время как другой пользователь может выбрать 08/04/2011 20:30.
это полный кошмар для программиста BAT.
изменение формата на формат фирмы может устранить проблему, если вы восстановите предыдущий формат до оставляя файл BAT. Но это может быть предметом неприятных условий гонки и усложнить восстановление в отмененных файлах BAT.
к счастью, есть альтернатива.
вместо этого вы можете использовать WMIC. WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table возвращает дату и время неизменным способом. Очень удобно непосредственно анализировать его с помощью .
Итак, собирая кусочки вместе, попробуйте это в качестве отправной точки.
Я нашел лучшее решение для меня, прочитав все ваши ответы:
Если я получу 20160915_ 150101 (с ведущим пространством и временем).
Если PM я получу 20160915_2150101 .
Вы можете добавить ведущие нули к переменной (значение до 99) как это в партии: IF 1%Var% LSS 100 SET Var=0%Var%
поэтому вам нужно разобрать компоненты даты и времени на отдельные переменные, обработать их все так, а затем объединить их вместе, чтобы создать имя файла.
однако, ваш базовый метод для парсинга даты и времени зависит от региональных настроек системы. Если вы рады, что ваш код не переносится на другие машины, это, вероятно, нормально, но если вы ожидайте, что он будет работать в разных международных контекстах, тогда вам понадобится другой подход, например, зачитав параметры реестра:
(этот последний контролирует, есть ли начальный ноль по времени, но не даты, насколько я знаю).
это занимает MB5L.txt и сжимает его до ziptest20120204.zip, если запустить 4 февраля 2012
ваш вопрос, кажется, решен, но .
Я не уверен, что вы принимаете правильное решение для своей проблемы.
Я полагаю, вы пытаетесь сжимать каждый день фактический код проекта.
это возможно с ZIP и 1980 это было хорошее решение, но сегодня вы должны использовать систему репозитория, как subversion или git или . но не zip-архив.
хорошо, возможно, я ошибаюсь.
из ответа выше я сделал готовую к использованию функцию.
проверено с французскими локальными параметрами.
Я понимаю, что это спорный вопрос для ОП, но я только что заварил это, и я немного горжусь собой за то, что мыслил нестандартно.
если вы уже знаете C, с++, Perl, или Руби, затем собирание на awk (который наследует от первых двух и вносит значительный вклад в последние два) - это кусок пресловутого пирога.
команда пакета DOS:
принты:
теперь это не совсем полная история. Я просто буду ленивым и жестко закодирую остальную часть моего имени файла журнала в инструкции printf, потому что это просто. Но если кто-нибудь знает как установите переменную %NOW% в выход AWK (yeilding кишки "универсальной" функции now), тогда я все уши.
EDIT:
быстрый поиск по переполнению стека заполнил этот последний кусок головоломки,пакетный эквивалент bash backticks.
Итак, эти три строки пакета DOS:
Итак, теперь я могу включить datetime в имя файла журнала произведенный моей установкой SQL Server (2005+) скрипт таким образом:
и я снова счастливый турист (за исключением того, что жизнь все еще была намного проще в Unix).
пробел является законным в именах файлов. Если вы поместите свой путь и имя файла в кавычки, он может просто летать. Вот что я использую в пакетном файле:
Читайте также: