Alterando permissões de arquivo de acordo com seus nomes

3

Eu criei 512 arquivos, com nomes feitos de combinações de permisões ( r , w , x ).

Eu os criei assim:

touch ./{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}

e eu quero que os arquivos tenham as mesmas permissões que o nome indica por exemplo, os arquivos r-x--xrwx devem ter permissões r-x--xrwx .

Eu tentei fazer assim:

for i in *
do
    u=${i:0:3};g=${i:3:3};o=${i:6:3}
    chmod u=$u,g=$g,o=$o -- $i
done

Alguns dos arquivos acabam com as permissões corretas, mas, por outras, as permissões não correspondem ao nome. Como posso consertar isso?

    
por user3706129 15.12.2015 / 18:24

2 respostas

5

Os parâmetros que você está transmitindo para chmod incluem - símbolos, mas não devem. Para corrigir isso, remova os símbolos - :

for i in *
do
  u=${i:0:3};g=${i:3:3};o=${i:6:3};
  u=${u//-/};g=${g//-/};o=${o//-/};
  chmod -- "u=$u,g=$g,o=$o" "$i"
done
    
por 15.12.2015 / 18:41
0

Você pode converter os nomes em um número octal (por exemplo, 744) e usá-lo para alterar as permissões:

#!/bin/bash
# touch ./{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}

for filename in *
do
    str="$filename"
    str="${str//-/0}"
    str="${str//[^0]/1}"
    dec="$((2#$str+0))"
    oct="$(printf '%03o' "$dec")"
    #echo "$str $dec $oct : "
    chmod -- "$oct" "$filename"
done

O número octal é obtido por:

  • altere cada - para zero 0 , cada uma das outras por um 1 .
  • converta o número binário em um decimal (porque o shell entende apenas o decimal).
  • converta o número decimal em octal.
  • use o número octal para alterar as permissões.

O - no comando chmod é porque os nomes de arquivos com vários traços - são confusos para o comando, ele acredita que o nome do arquivo é uma opção.

    
por 15.12.2015 / 23:56