Assegurando que os subdiretórios não serão afetados por um loop (ou por find)

2

Por favor, reveja estes códigos que visam basicamente a mesma tarefa (encontrar o principal .htaccess do site e alterá-lo):

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

e:

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

Eles também devem afetar .htaccess arquivos em subdiretórios de cada diretório em public_html ?

    
por user9303970 20.06.2018 / 18:05

2 respostas

4

Na verdade, o primeiro loop considera apenas os arquivos na estrutura de diretórios imediata que você listou (com os curingas preenchidos, é claro). O comando find que você listou não se restringe a nenhum nível de estrutura de diretórios, e executaria chmod em qualquer arquivo e todos chamado .htaccess na árvore de diretórios.

Para restringir o comando find apenas à estrutura de diretórios na qual ele inicia (observando que você o forneceu, via globs, vários diretórios iniciais), adicione o predicado -maxdepth 1 :

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

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 .

    
por 20.06.2018 / 18:57