Intereting Posts
Как устранить эти ошибки SELinux AVC? sshfs разрывает символические ссылки с сервера SFTP Если я rm -rf символической ссылки будут данные, на которые указывает ссылка, чтобы получить стирание тоже? Вход с использованием закрытого ключа на USB-ключ на SSH @ linux Связь между «Размер блока» и «Верхние пределы» в ext2 Bash: разрешить круглые скобки в аргументах команды (т.е. предотвратить «неожиданный токен» (‘”) Как неинтерактивные программы получают разрешение на редактирование файлов в / etc установить MAC-адрес в файле «интерфейсы» без настройки других параметров сети Драйверы видеокарты Nvidia для совместимости с Linux Эквивалент Linux для Microsoft Visio? Как загрузить 32-битное ядро ​​Linux с 64-разрядным EFI Grub? Инструмент GUI для мониторинга Java-процесса Не удается запустить snmpd правильно Установка раздела в «песочницу» Как подсчитать аналогичные результаты в нескольких столбцах в Libre Office Calc?

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

Пожалуйста, просмотрите эти коды, которые предназначены для выполнения в основном той же задачи (поиск основного .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 .