Intereting Posts
awk с переменными в состоянии и в файле перенаправления вывода Как переименовать несколько файлов с префиксом и суффиксом с помощью команды find Удаление файла, который не имеет никаких разрешений и атрибутов Заменить подстроку имен файлов в каталоге Как перебрать две переменные в сценарии sh? почему существует ограничение на размер жесткого диска в разделении MBR? set -u использование не работает как ожидалось case + как реализовать равный или меньше или больше в случае синтаксиса Как изменить цвета всех запущенных экземпляров urxvt? vim: заменить весь символ до конца строки точное совпадение в regrex при использовании vim, man или less Каков безопасный способ запуска Java 7 на SELinux Как передать результат предыдущей команды узлу в качестве переменной? Как отключить систему после выхода определенного процесса Как остановить авахи-демона

Обеспечение того, что подкаталоги не будут затронуты циклом (или поиском)

Пожалуйста, просмотрите эти коды, которые предназначены для выполнения в основном той же задачи (поиск основного .htaccess сайта и его изменение):

 for dir in "$HOME"/public_html/*.{com,co.il}/; do if pushd "$dir"; then chmod 644 .htaccess popd fi done 2>/dev/null 

а также:

 find "$HOME"/public_html/*.{com,co.il} -name ".htaccess" -exec chmod 644 {} \; 

Должны ли они также влиять на файлы .htaccess в подкаталогах каждого каталога в public_html ?

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

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

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

Ваш первый fragment кода:

 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 , которые есть, являются единственными, к которым мы должны относиться.

Ваш второй fragment кода:

 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 .