Assumindo que o uso de chmoddo pacote coreutils GNU no Ubuntu 12.10.
chmod 775 . -Rexecuta a fchmodatchamada 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 fchmodatem 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/ chmodmencionado por outras pessoas provavelmente será mais rápido alterando apenas os arquivos que precisam ser alterados.
- A chamada para
fchmodataltera 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/ chmodalguns 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/ chmodporque find dá mais controle sobre a seleção de coisas.