Каждый день мне нужно переместить четыре файла из одной папки в подпапку. 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
Видимо, я неправильно использую список шаблонов. Как мне правильно его использовать?
Я удивлен, увидев, что вы используете \ в именах своих файлов .txt.
@Фравадона, нет?
date -d "1 day ago" "+\%y\%m\%d => \24\05\25@Fravadona Это просто уход от %. См. stackoverflow.com/questions/21749305/date-y-m-d-in-crontab
Ах да, забыл об этом
@Бен, в твоем сообщении об ошибке написано /bin/sh: ..., а не /bin/bash: ... или что-то подобное.
@EdMorton Это крайне раздражает, когда такие комментаторы, как вы и jhnc, публикуют эти комментарии-загадки. Если бы я понял, о чем идет речь в вашем комментарии, у меня, скорее всего, не было бы той проблемы, с которой я столкнулся, не так ли? Я никогда не понимаю, почему люди публикуют эти умные вопросы-загадки, которые показывают ОП, как мало он знает и насколько он глуп, не объясняя, что он делает неправильно. Почему бы вам просто прямо не сказать, почему эта часть сообщения об ошибке неверна? Ваши комментарии даже не помогают мне понять, что я делаю не так. Стоит ли мне гуглить «sh bash»? Или что?
@jhnc Смотрите мой комментарий ЭдМортону. Я не знаю, нужны ли мне функции bash. Почему ты заставляешь меня умолять объяснить? Неужели это ниже вашего достоинства просто объяснять, что я делаю не так, вместо того, чтобы загадывать мне какую-то загадку?
фравадона уже ответила. Ваш вопрос отмечен тегом shell, что, как следует из текста, означает оболочку POSIX. Оболочка POSIX сопоставление с образцом не включает шаблоны bash extglob. Если вы хотите использовать шаблоны bash extglob, вам нужно использовать bash.
@(... недействителен в sh.
Для более сложных команд я предлагаю вам не пытаться взломать команду sh для вашего задания cron, а поместить ее в сценарий оболочки, который вы затем вызываете из cron. Это также немного проще для отладки.
@Бен, я отвечал на твой вопрос, поэтому не думал, что мой комментарий требует дополнительных объяснений. jhnc сказал: «Если вам нужны функции bash, почему вы не используете bash?» и ты ответил: «Я нет?» что я прочитал как «как ты можешь знать, что это не так?» и поэтому я ответил: «В вашем сообщении об ошибке написано /bin/sh: ..., а не /bin/bash: ... или что-то подобное». Ничего умного в этом нет - jhnc знает, что вы не используете bash, потому что в вашем сообщении об ошибке говорится, что это от sh, а не bash, вот и все. Удачи и извините, что так раздражаю.





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'
Вы уверены, что знаки вопроса правильно расставлены в вашем обходном пути?
Извините, я не понимаю вашего комментария; Я не вижу ? в строке
Извините, я имел в виду кавычки. Я не носитель языка.
Хорошо, просто попробуйте заменить mv на echo -E и запустите команду в оболочке: bash -c 'echo -E /path/path/{changes,planned}-{ar,dp}-"$(date -d "1 day ago" "+\%y\%m\%d")".txt /path/subfolder'
Да, я знаю, что это работает. Я просто не понимаю, почему. Потому что это не имеет смысла: "$(date -d "1 day ago" "+\%y\%m\%d")". Кавычки окружают неправильные части. Вместо "1 day ago" и "+\%y\%m\%d" есть "$(date -d ", " " и ")". Это меня смущает.
для подстановки команд двойные кавычки являются контекстными; с "$( ... )" вам не нужно беспокоиться о том, что внешние двойные кавычки нарушают то, что находится в ...
если вам нужны функции bash, почему вы не используете bash?