Eu tenho um diretório/some/dir contendo milhões de arquivos e diretórios. Preciso remover o bit X de todos os arquivos, mas não dos diretórios.
Os seguintes trabalhos:
find /some/dir -type f -chmod -x {} \;
Mas acredito que isso gere um processo "chmod" para cada arquivo. Isso pode explicar por que funciona por tanto tempo.
Existe uma maneira de fazer isso de maneira mais eficiente?
Responder1
Além disso xargs
, como Ljm Dullaart mencionou, você pode usar:
find /some/dir -type f -exec chmod -x {} +
Como truque de depuração, você pode ver o comando gerado com:
find /some/dir -type f -exec echo chmod -x {} +
Na página de manual doencontrar(1)comando:
-exec command {} +
Esta variante da-exec
ação executa o comando especificado nos arquivos selecionados, mas a linha de comando é construída anexando cada nome de arquivo selecionado no final; o número total de invocações do comando será muito menor que o número de arquivos correspondentes. A linha de comando é construída da mesma maneira que o xargs constrói suas linhas de comando. Apenas uma instância de{}
é permitida no comando e deve aparecer no final, imediatamente antes de+
; ele precisa ser escapado (com um\
) ou entre aspas para protegê-lo da interpretação pelo shell. O comando é executado no diretório inicial. Se qualquer invocação com o+
formulário retornar um valor diferente de zero como status de saída, find retornará um status de saída diferente de zero. Se find encontrar um erro, isso às vezes pode causar uma saída imediata, portanto, alguns comandos pendentes podem nem ser executados. Por esse motivo,-exec my-command ... {} + -quit
pode não resultar na execução de my-command. Esta variante de-exec
sempre retorna verdadeiro.
Responder2
Use xargs
para limitar a desova:
find /path/to/base/dir -type f -print0 | xargs -0 chmod -x