Assumindo o uso de chmod
do pacote GNU coreutils no Ubuntu 12.10.
chmod 775 . -R
executa a chamada do sistema fchmodat
para cada arquivo que ele encontra, independentemente de as permissões precisarem ser alteradas ou não. Confirmei isso inspecionando o código e usando strace chmod 775 . -R
(snippet abaixo) para listar o comportamento real.
newfstatat(4, "d", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "d", 0775) = 0
newfstatat(4, "c", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "c", 0775) = 0
newfstatat(4, "a", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "a", 0775) = 0
newfstatat(4, "b", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "b", 0775) = 0
Existem algumas desvantagens de executar fchmodat
em cada arquivo
- A chamada extra do sistema provavelmente se tornará significativa se um grande número de arquivos for alterado. O método
find
/ xargs
/ chmod
mencionado por outros provavelmente será mais rápido mudando apenas os arquivos que precisam ser alterados.
- A chamada para
fchmodat
altera a modificação do status do arquivo (ctime) de cada arquivo. Isso fará com que cada arquivo / inode mude a cada vez e provavelmente causará excesso de gravações em disco. Pode ser possível usar opções de montagem para parar essas gravações em excesso.
Uma experiência simples mostra as alterações da hora que acontecem para chmod
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 d
auser@duncow:/tmp/blah.test$ chmod 775 . -R
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d
Mas isso não muda para find
/ xargs
/ chmod
alguns minutos depois
auser@duncow:/tmp/blah.test$ date
Tue Jun 18 18:27:27 BST 2013
auser@duncow:/tmp/blah.test$ find . ! -perm 775 -print0 | xargs -0 -I {} chmod 775 {}
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d
Eu sempre costumo usar a versão find
/ xargs
/ chmod
, pois o Google dá mais controle sobre a seleção de itens.