Как использовать список шаблонов в более длинном имени пути в cronjob?

Каждый день мне нужно переместить четыре файла из одной папки в подпапку. 26 мая, вот вчерашние файлы:

changes-ar-240525.txt
changes-dp-240525.txt
planned-ar-240525.txt
planned-dp-240505.txt

Используя cronjob, я могу автоматически переместить каждый отдельный файл в подпапку следующим образом:

16 2 * * * mv /path/changes-ar-`date -d "1 day ago" "+\%y\%m\%d"`.txt /path/subfolder
17 2 * * * mv /path/changes-dp-`date -d "1 day ago" "+\%y\%m\%d"`.txt /path/subfolder
18 2 * * * mv /path/planned-ar-`date -d "1 day ago" "+\%y\%m\%d"`.txt /path/subfolder
19 2 * * * mv /path/planned-dp-`date -d "1 day ago" "+\%y\%m\%d"`.txt /path/subfolder

Я хотел бы сделать это с помощью одного задания cron, используя список шаблонов. Я пытался:

18 2 * * * mv /path/path/@(changes|planned)-@(ar|dp)-`date -d "1 day ago" "+\%y\%m\%d"`.txt /path/subfolder

но он возвращает ошибку:

/bin/sh: 1: Syntax error: "(" unexpected

Видимо, я неправильно использую список шаблонов. Как мне правильно его использовать?

если вам нужны функции bash, почему вы не используете bash?

jhnc 26.05.2024 08:06

Я удивлен, увидев, что вы используете \ в именах своих файлов .txt.

Fravadona 26.05.2024 09:23

@Фравадона, нет?

user24031531 26.05.2024 09:24
date -d "1 day ago" "+\%y\%m\%d => \24\05\25
Fravadona 26.05.2024 09:25

@Fravadona Это просто уход от %. См. stackoverflow.com/questions/21749305/date-y-m-d-in-crontab

user24031531 26.05.2024 09:31

Ах да, забыл об этом

Fravadona 26.05.2024 09:32

@Бен, в твоем сообщении об ошибке написано /bin/sh: ..., а не /bin/bash: ... или что-то подобное.

Ed Morton 26.05.2024 22:45

@EdMorton Это крайне раздражает, когда такие комментаторы, как вы и jhnc, публикуют эти комментарии-загадки. Если бы я понял, о чем идет речь в вашем комментарии, у меня, скорее всего, не было бы той проблемы, с которой я столкнулся, не так ли? Я никогда не понимаю, почему люди публикуют эти умные вопросы-загадки, которые показывают ОП, как мало он знает и насколько он глуп, не объясняя, что он делает неправильно. Почему бы вам просто прямо не сказать, почему эта часть сообщения об ошибке неверна? Ваши комментарии даже не помогают мне понять, что я делаю не так. Стоит ли мне гуглить «sh bash»? Или что?

user24031531 27.05.2024 07:29

@jhnc Смотрите мой комментарий ЭдМортону. Я не знаю, нужны ли мне функции bash. Почему ты заставляешь меня умолять объяснить? Неужели это ниже вашего достоинства просто объяснять, что я делаю не так, вместо того, чтобы загадывать мне какую-то загадку?

user24031531 27.05.2024 07:35

фравадона уже ответила. Ваш вопрос отмечен тегом shell, что, как следует из текста, означает оболочку POSIX. Оболочка POSIX сопоставление с образцом не включает шаблоны bash extglob. Если вы хотите использовать шаблоны bash extglob, вам нужно использовать bash.

jhnc 27.05.2024 07:44
@(... недействителен в sh.
user1934428 27.05.2024 09:03

Для более сложных команд я предлагаю вам не пытаться взломать команду sh для вашего задания cron, а поместить ее в сценарий оболочки, который вы затем вызываете из cron. Это также немного проще для отладки.

user1934428 27.05.2024 09:04

@Бен, я отвечал на твой вопрос, поэтому не думал, что мой комментарий требует дополнительных объяснений. jhnc сказал: «Если вам нужны функции bash, почему вы не используете bash?» и ты ответил: «Я нет?» что я прочитал как «как ты можешь знать, что это не так?» и поэтому я ответил: «В вашем сообщении об ошибке написано /bin/sh: ..., а не /bin/bash: ... или что-то подобное». Ничего умного в этом нет - jhnc знает, что вы не используете bash, потому что в вашем сообщении об ошибке говорится, что это от sh, а не bash, вот и все. Удачи и извините, что так раздражаю.

Ed Morton 27.05.2024 18:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
13
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

cron использует /bin/sh.

В то время как в некоторых ОС вы можете изменить оболочку, добавив SHELL=/bin/bash в начало crontab, здесь вы используете расширенное расширение bash, которое может быть не включено по умолчанию; это может быть проблемой, поскольку вы не можете включить его и использовать в одной строке (как того требует crontab), например:

#!/bin/bash
shopt -u extglob # unset extended globing, for testing

# try to enable it and use it in a single line
shopt -s extglob; echo @(*)
bash: syntax error near unexpected token `('

В качестве обходного пути вы можете использовать расширения фигурных скобок вместо расширенных glob:

18 2 * * * bash -c 'mv /path/path/{changes,planned}-{ar,dp}-"$(date -d "1 day ago" "+\%y\%m\%d")".txt /path/subfolder'

Вы уверены, что знаки вопроса правильно расставлены в вашем обходном пути?

user24031531 27.05.2024 07:37

Извините, я не понимаю вашего комментария; Я не вижу ? в строке

Fravadona 27.05.2024 08:47

Извините, я имел в виду кавычки. Я не носитель языка.

user24031531 27.05.2024 09:28

Хорошо, просто попробуйте заменить mv на echo -E и запустите команду в оболочке: bash -c 'echo -E /path/path/{changes,planned}-{ar,dp}-"$(date -d "1 day ago" "+\%y\%m\%d")".txt /path/subfolder'

Fravadona 27.05.2024 09:35

Да, я знаю, что это работает. Я просто не понимаю, почему. Потому что это не имеет смысла: "$(date -d "1 day ago" "+\%y\%m\%d")". Кавычки окружают неправильные части. Вместо "1 day ago" и "+\%y\%m\%d" есть "$(date -d ", " " и ")". Это меня смущает.

user24031531 27.05.2024 09:41

для подстановки команд двойные кавычки являются контекстными; с "$( ... )" вам не нужно беспокоиться о том, что внешние двойные кавычки нарушают то, что находится в ...

Fravadona 27.05.2024 10:02

Другие вопросы по теме