Я пытаюсь добавить текущую дату в конец имени файла следующим образом:
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Ответы:
Более чем вероятно, это ваше использование
set
. Это назначит 'today', '=' и выводdate
программы позиционным параметрам (или аргументам командной строки). Вы хотите просто использовать оболочку C (которую вы помечаете как «bash», так что скорее всего нет), вы захотите использовать:Обратите внимание на отсутствие пробелов вокруг знака равенства.
Вы также не хотите использовать
&
в конце ваших утверждений; что заставляет оболочку не ждать завершения команды. Особенно, когда один полагается на следующий. Командаfind
может потерпеть неудачу, потому что она запускается до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
от времени последнего чтения файла (если ваша система отслеживает это, а если нет, то время может быть уже как время изменения).источник
Вы можете переименовать файл с пометкой времени
источник
Этот:
должно сработать. Хотя, похоже, что вы используете csh, и моё решение убрать знак + может не сработать, но попробовать не помешает. Заключение вашей переменной в фигурные скобки {} - это всегда хорошая идея, чтобы предотвратить непредвиденное расширение переменной.
источник