Ваш первый фрагмент кода:
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
.