Вы не можете действительно влиять на среду "горизонтально" в канале - процессы в a ... p_n | p_n+1 | p_n+2 ...
канал порожден тем же интерпретатором оболочки, следовательно нет никакого способа измениться, переменная среды говорят p_n
от p_m
, echii находится в том же конвейере.
Если просто необходимо сделать простое преобразование имен файлов, которые могут быть достигнуты с регулярными выражениями, то пример Perl rename
должен сделать. Вы могли бы хотеть/нуждаться использовать xargs
предотвратить проблемы с выходом
find ... -print0 | xargs -0 rename "regexps"
который разграничивает имена файлов с байтами NUL (NUL, и обратная косая черта единственные символы, которым обычно запрещают появиться в имени файла).
Если Ваши имена файлов хорошего поведения (и следовательно можно принять, который Вы надеваете; 't нужен любой специальный выход "странных" символов как кавычки, пробелы и разделители, используемые в regexps), можно также сделать что-то быстрое и грязное как:
find ... | sed -r "regexps" | sh -
В этом случае regexps должны создать допустимый вызов команды mv
(или что-то еще, что делает желаемое действие) - оно может быть похожим:
"s|^.*$|mv -vi & &.old|"
который производит что-то как
...
mv -vi /etc/a2ps.cfg /etc/a2ps.cfg.old
mv -vi /etc/aclocal_dirlist /etc/aclocal_dirlist.old
...
Если бы простое регулярное выражение не является достаточно мощным или было бы слишком громоздким, просто запишите простой сценарий, который обрабатывает имена файлов и делает переименовывание/перемещение себя и называет его любым от находки непосредственно (-exec
или -exec +
) или через xargs
.
Наконец, если Вы просто хотите переместить набор копии файлов к другому каталогу, используйте -t
опция cp
и mv
. cp
в GNU coreutils также имеет --parents
опция, которая копирует источник с его полным путем.
Для того, чтобы что-то исполнилось только во второй понедельник месяца, день недели должен быть равен 1, а день месяца - 8-14, час - 2,6,10,14,18,22 и минута - 0. Однако, как правильно прокомментировал Даг и предоставил решение, при указании как дня недели, так и дня месяца (т.е. не как *
), программа выполняется, когда оба совпадают. Следовательно, вы должны тестировать явно для любого из них, и день недели проще:
0 2,6,10,14,18,22 8-14 * * test $(date +\%u) -eq 1 && /opt/bin/cleanup.sh
Последний 1 определяет понедельник, а диапазон дней месяца (8-14) выбирает его только тогда, когда это второй понедельник.
Третий день каждого месяца, заканчивающийся на "r" в 18:15:
15 18 3 september,october,november,december * /opt/bin/verrrrrrrry.sh
(по крайней мере, на Vixie cron вы можете использовать названия месяцев. Если ваше не поддерживает, вы можете заменить его на 9-12
)
Формат минута / час / день месяца / месяц / день недели
Так что это сделало бы
0 4 9-15 * 2 /опт/внутрь/чистка.sh
и
15 18 3 8-14 * /опт/внутрь/веррррррррррррррррррррррррррррррррррррррррррррррррррррррррр. sh
Запись cron, которая будет запускаться во 2-й понедельник каждого месяца каждые 4 часа, начиная с 02:00
00 02/4 8-14 * * [ `date +\%u` = 1 ] && /opt/bin/cleanup.sh
http://crontab.guru/#00_02/4_8-14_*_1
Запись cron, которая будет запускаться в 18:15 3-го дня каждого месяца, заканчивающегося на "r"
15 18 3 9-12 * /opt/bin/verrrrrrrry.sh
http://crontab.guru/#15_18_3_9-12_*