Seu primeiro trecho de código:
for dir in "$HOME"/public_html/*.{com,co.il}/; do
if pushd "$dir"; then
chmod 644 .htaccess
popd
fi
done 2>/dev/null
Isso pode ser reescrito sem mudar para dentro e fora dos diretórios, pois
for dir in "$HOME"/public_html/*.{com,co.il}/; do
chmod 644 "$dir/.htaccess"
done 2>/dev/null
e até mesmo ser encurtado (ou pelo menos modificado) daquele para
for pathname in "$HOME"/public_html/*.{com,co.il}/.htaccess; do
chmod 644 "$pathname"
done 2>/dev/null
que, se não houver muitos desses arquivos, pode ser feito com
chmod 644 "$HOME"/public_html/*.{com,co.il}/.htaccess 2>/dev/null
Isso só olha para os arquivos .htaccess
nos subdiretórios de public_html
, e não para baixo na estrutura de diretórios.
Observe que as duas últimas variações não tentarão chmod
de arquivos ausentes. O loop original e minha primeira variante dele assume que há .htaccess
arquivos para chmod
nos diretórios dados, enquanto as duas últimas variantes apenas fazem um loop sobre os arquivos .htaccess
que estão realmente presentes . Os loops anteriores dão a você uma oportunidade de testar se um diretório contém tal arquivo (o que você não faz), enquanto os comandos posteriores presumem que os arquivos .htaccess
que estão lá são os únicos que precisamos nos preocupar com .
Seu segundo trecho de código:
find "$HOME"/public_html/*.{com,co.il} -name ".htaccess" -exec chmod 644 {} \;
Isso, por outro lado, procura .htaccess
arquivos em qualquer lugar dentro ou abaixo dos diretórios definidos por "$HOME"/public_html/*.{com,co.il}
. Você pode corrigir isso adicionando -maxdepth 1
antes de -name
. Isso impediria o find
de recorrer aos subdiretórios dos diretórios dados e forçá-lo a parar no nível superior.
Adicionar -maxdepth 1
a find
faz com que funcione praticamente da mesma maneira que o meu último loop real acima.
Nenhum dos dois comandos tenta verificar se os arquivos .htaccess
encontrados são realmente arquivos regulares e não diretórios etc. Em seu loop, você poderia fazer isso com um -f
test e no comando find
, você poderia fazer isso dizendo -type f
antes do -exec
.