Обеспечение того, чтобы подкаталоги не были затронуты loop (или с помощью find)

Что вы можете сделать, так это установить задание на выполнение в течение всего периода, который вы хотите исключить:

# 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.

2
21.06.2018, 04:27
2 ответа

Действительно, первый цикл рассматривает только файлы в непосредственной структуре каталогов, которую вы указали (с заполненными подстановочными знаками, конечно ). Перечисленная вами команда findне ограничивается каким-либо уровнем структуры каталогов и будет запускать chmodдля любого и всех файлов с именем.htaccess в дереве каталогов.

Чтобы ограничить команду findтолько структурой каталогов, она начинается в (, отметив, что вы дали ей несколько начальных каталогов через подстановочные знаки ), добавьте предикат -maxdepth 1:

find "$HOME"/public_html/*.{com,co.il} -maxdepth 1 -name ".htaccess" -exec chmod 644 {} \;
4
27.01.2020, 21:51

Ваш первый фрагмент кода:

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.

4
27.01.2020, 21:51

Теги

Похожие вопросы