Assumindo que o uso de chmod
do pacote coreutils GNU no Ubuntu 12.10.
chmod 775 . -R
executa a fchmodat
chamada do sistema para cada arquivo encontrado 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 outras pessoas provavelmente será mais rápido alterando 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 seja alterado a cada vez e provavelmente causará excesso de gravações no disco. Pode ser possível usar as opções de montagem para interromper essas gravações em excesso.
Um experimento simples mostra as mudanças ctime acontecendo diretamente 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 por 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 tenderia a usar a versão find
/ xargs
/ chmod
porque find dá mais controle sobre a seleção de coisas.