Что вы можете сделать, так это установить задание на выполнение в течение всего периода, который вы хотите исключить:
# crontab
# MIN HOUR DAY MONTH DAYOFWEEK COMMAND
0 1 1-7,15-21 * 7 ID=naptime /path/to/naptime.sh
naptime.sh:
#!/bin/sh
# Exit unless Sunday
if [ $(date +%u) -ne 7 ] ; then
exit
fi
sleep 2h
Затем вы можете установить целевое задание на "зависимость" от задания naptime:
# crontab
* * * * * FREQ=1m AFTER=naptime/1m /path/to/job.sh
Из crontab(1):
Jobs can be made to "depend" on, or wait until AFTER other jobs have successfully completed. Consider the following crontab:
* * * * * ID=job5 FREQ=1h AFTER=job4/30m second_command
Here, whenever job5 is up to be run, if job4 is scheduled to run within the next 30 minutes (30m), job5 will first wait for it to successfully complete.
Действительно, первый цикл рассматривает только файлы в непосредственной структуре каталогов, которую вы указали (с заполненными подстановочными знаками, конечно ). Перечисленная вами команда find
не ограничивается каким-либо уровнем структуры каталогов и будет запускать chmod
для любого и всех файлов с именем.htaccess в дереве каталогов.
Чтобы ограничить команду find
только структурой каталогов, она начинается в (, отметив, что вы дали ей несколько начальных каталогов через подстановочные знаки ), добавьте предикат -maxdepth 1
:
find "$HOME"/public_html/*.{com,co.il} -maxdepth 1 -name ".htaccess" -exec chmod 644 {} \;
Ваш первый фрагмент кода:
for dir in "$HOME"/public_html/*.{com,co.il}/; do
if pushd "$dir"; then
chmod 644.htaccess
popd
fi
done 2>/dev/null
Это можно было бы переписать, не переходя в каталоги и из них, как
for dir in "$HOME"/public_html/*.{com,co.il}/; do
chmod 644 "$dir/.htaccess"
done 2>/dev/null
и даже быть сокращенным (или, по крайней мере, измененным )с этого на
for pathname in "$HOME"/public_html/*.{com,co.il}/.htaccess; do
chmod 644 "$pathname"
done 2>/dev/null
что, если таких файлов не слишком много, можно сделать с помощью
chmod 644 "$HOME"/public_html/*.{com,co.il}/.htaccess 2>/dev/null
При этом рассматриваются только .htaccess
файлы в подкаталогах public_html
, а не ниже в структуре каталогов.
Обратите внимание, что последние два варианта не будут пытаться chmod
отсутствующие файлы. Исходный цикл и мой первый его вариант предполагает , что в заданных каталогах есть .htaccess
файлов до chmod
, в то время как последние два варианта просто перебирают .htaccess
файлы, которые на самом деле присутствуют. Более ранние циклы дают вам возможность проверить, содержит ли каталог такой файл (, чего вы не делаете ), тогда как более поздние команды предполагают, что файлы .htaccess
— это единственные, которые нам нужны. заботиться о себе.
Ваш второй фрагмент кода:
find "$HOME"/public_html/*.{com,co.il} -name ".htaccess" -exec chmod 644 {} \;
Это, с другой стороны, ищет .htaccess
файлы в любом месте или ниже каталогов, определенных "$HOME"/public_html/*.{com,co.il}
. Вы можете исправить это, добавив -maxdepth 1
перед -name
. Это остановит find
рекурсию вниз в подкаталоги заданных каталогов и заставит его остановиться на верхнем уровне.
Добавление -maxdepth 1
к find
заставляет его работать почти так же, как мой последний фактический цикл выше.
Ни одна из двух команд не пытается проверить, что найденные файлы .htaccess
на самом деле являются обычными файлами, а не каталогами и т. д. В своем цикле вы можете сделать это с помощью теста -f
, а в команде find
вы можете сделать это, сказав -type f
перед -exec
.