Добавление текущей даты из переменной в имя файла


55

Я пытаюсь добавить текущую дату в конец имени файла следующим образом:

TheFile.log.2012-02-11

Вот что у меня так далеко:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

Однако все, что я получаю, это имя файла, и оно ничего не добавляет. Как добавить текущую дату к имени файла?


Когда вы добавляете дату, убедитесь, что она не используется, :потому что тогда она будет считываться как хост в rsync и scp. stackoverflow.com/a/37143274/390066
kirill_igum

Ответы:


78

Более чем вероятно, это ваше использование set. Это назначит 'today', '=' и вывод dateпрограммы позиционным параметрам (или аргументам командной строки). Вы хотите просто использовать оболочку C (которую вы помечаете как «bash», так что скорее всего нет), вы захотите использовать:

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

Обратите внимание на отсутствие пробелов вокруг знака равенства.

Вы также не хотите использовать &в конце ваших утверждений; что заставляет оболочку не ждать завершения команды. Особенно, когда один полагается на следующий. Команда findможет потерпеть неудачу, потому что она запускается до mkdir.


Спасибо за этого приятеля, теперь он работает на 100% нормально, привет за хедз-ап и и MkDir
Я ЕСМЬ

55

Скрипт Bash для вставки даты в имя файла:

Этот код Bash в файле называется a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

При запуске печатает:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

Пояснение к коду:

Интерпретируйте скрипт с помощью интерпретатора / bin / bash. Создайте новую переменную с именем today. Выполните команду date, передав флаги Y, m, d, H, M, S для настройки вывода. Поместите результат в переменную даты.

Создайте новую переменную с именем filename, окружите переменную $ today остальным текстом статического имени файла. затем введите имя файла на экран.

Втирайте его в однострочник, чтобы увеличить lulz:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"

5

Вы, кажется, перепутали несколько вещей.

set today = 'date +%Y'выглядит как синтаксис tcsh, но даже в tcsh он присваивает строку date +%Yпеременной today, он не запускает dateкоманду. Поскольку вы, вероятно, используете bash или какую-либо другую оболочку POSIX, синтаксис присваивания today=some_value(без пробелов вокруг знака равенства). Чтобы запустить команду и назначить ее вывод переменной, используйте подстановку команды :

today=$(date +%Y-%m-%d)

(Я также завершил спецификацию даты). Вы можете использовать обратные кавычки вместо долларовых скобок, но это может привести к тому, что они будут визуально перепутаны с прямыми кавычками, а правила, когда вам нужны кавычки внутри команды с обратными кавычками, довольно сложны и зависят от реализации, поэтому лучше не придерживаться $(…)(что имеет тот же эффект с более разумным синтаксисом).

Вы использовали &в конце несколько команд. Это заставляет команду выполняться в фоновом режиме, что здесь не нужно. Я подозреваю, что вы имели в виду &&, что означает выполнение следующей команды, только если первая команда прошла успешно.

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

Альтернативой использованию &&после каждой команды является запуск вашего скрипта set -e. Это говорит оболочке прекратить выполнение скрипта, как только любая команда вернет ненулевой статус (за исключением команд в ifусловиях и нескольких других случаях).

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

Ваша findкоманда в порядке, но, вероятно, не делает то, что вы собираетесь делать (хотя я не знаю точно, что это такое).

Вы создаете каталог с помощью, mkdirа затем сразу же просматриваете его find. Это не будет полезно, если каталог уже существует. Вы имели в виду создать каталог для сегодняшних журналов и переместить последние файлы из The_Logsкаталога под названием, например The_Logs.2012-02-11?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

Или вы хотели переименовать сегодняшние файлы журналов, чтобы добавить суффикс $today? Это требует вычисления разных имен файлов для каждого файла для перемещения.

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

Обратите внимание, что я использовал -mtimeдля перемещения файлов в зависимости от времени их изменения, а не -atimeот времени последнего чтения файла (если ваша система отслеживает это, а если нет, то время может быть уже как время изменения).



2

Этот:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

должно сработать. Хотя, похоже, что вы используете csh, и моё решение убрать знак + может не сработать, но попробовать не помешает. Заключение вашей переменной в фигурные скобки {} - это всегда хорошая идея, чтобы предотвратить непредвиденное расширение переменной.


Спасибо, приятель, после добавления твоего исправления другим ответом, он работает нормально.
Я ЕСМЬ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.