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

Вы могли также рассмотреть vimdiff, он выделяет различия между файлами в редакторе Vim

57
10.05.2016, 19:00
5 ответов

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

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

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

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

81
27.01.2020, 19:32
  • 1
    Спасибо за того помощника, его работа %100 прекрасных теперь, Аплодисментов для предостережения и и mkdir –  I AM L 05.12.2012, 02:20

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

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

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

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

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

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, который является временем, файл был в последний раз считан (если Ваша система отслеживает тот — если это не делает, atime еще может быть mtime).

5
27.01.2020, 19:32

Это:

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

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

2
27.01.2020, 19:32
  • 1
    Спасибо помощник, после добавления Вашего исправления с другим ответом, того, что это хорошо работало. –  I AM L 05.12.2012, 02:23

Бэш-скрипт для введения даты в имя файла:

Этот бэш-код в файле под названием 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. Сделайте новый вызов переменной сегодня. Выполните команду даты, передав флаги Y, m, d, H, M, S для настройки вывода. Поместите результат в переменную даты.

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

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

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"
56
27.01.2020, 19:32

Вы можете переименовать файл, добавив к нему отметку времени

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`
3
27.01.2020, 19:32

Теги

Похожие вопросы