Вы могли также рассмотреть vimdiff, он выделяет различия между файлами в редакторе Vim
Более, чем вероятный это - Ваше использование set
. Это присвоится 'сегодня', '=' и вывод date
программа к позиционным параметрам (иначе параметры командной строки). Вы хотите просто использовать оболочку C (который Вы отмечаете это как "удар", так вероятно, не), Вы захотите использовать:
today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire
Заметьте отсутствие пробелов вокруг знака "равно".
Вы также не хотите использовать &
в конце Ваших операторов; который заставляет оболочку не ожидать команды для окончания. Особенно, когда каждый полагается на следующее. find
команда могла перестать работать, потому что она запускается перед mkdir
.
Вы, кажется, перепутали несколько вещей.
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).
Это:
find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &
должен работать. Хотя, кажется на использование csh и моего решения удаления +, знак не может работать на Вас, но не повредит пробовать. При включении переменной в {} фигурные скобки, всегда хорошая идея предотвратить неожиданные переменные расширения.
Этот бэш-код в файле под названием 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"
Вы можете переименовать файл, добавив к нему отметку времени
mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`