chmod 444 em 800 arquivos no terminal Linux

0

Eu tenho quase 800 arquivos em um diretório que é /storage/ . E existem 800% dos arquivos.dat que estão agora na permissão -rw-rw-r-- . Eu quero mudar todos esses arquivos para o modo somente leitura. Eu tentei isso:

find /storage/ -name "*.dat" | xargs chmod 444

na máquina local e está funcionando bem para 10 ou 20 arquivos. Mas quando eu ssh para o meu servidor e faço o mesmo comando para esses 800 arquivos, demorou 20 minutos e o comando ainda está rodando.

Existe alguma maneira específica e rápida de fazer isso? Todos os meus arquivos não estão na máquina local, mas no servidor hospedado.

Esses 800 arquivos têm 30 GB cada.

    
por Junaid Farooq 27.11.2016 / 14:10

2 respostas

0

A principal diferença pode ser o tempo de pesquisa em um /storage muito maior. Maio esta pasta no servidor contém uma quantidade muito grande de qualquer tipo de arquivos que aumentam a duração necessária para encontrar todos os arquivos dat nesta árvore. O lado do servidor /storage pode ser lento também.

O próximo comando pode dar uma idéia disso (conta o número de arquivos e pastas em /storage ):

find /storage | wc -l

Observe também que o comando que você executa procurará todos os *.dat arquivos como uma primeira etapa e, em seguida, chamará chmod apenas uma vez com todos os nomes correspondentes como uma segunda etapa.

Chamar chmod com 20 argumentos de nome de arquivo é razoável, mas o argumento 800 caminho de arquivo se torna um pouco demais. Seu sistema tem limitações sobre o tamanho do argumento da linha de comando (veja xargs --show-limits ).

Eu sugiro que você pergunte diretamente a find para executar o seu comando, o que quebrará chmod das chamadas em vários sub- conjuntos. O próximo comando chamará chmod uma vez por pasta contendo dat arquivos, o que parece razoável:

find /storage -type f -name '*.dat' -execdir chmod 444 '{}' \+
  • Para obter um chmod por arquivo correspondente, é necessário substituir \+ por \;
  • Para ter uma ideia melhor da progressão, você pode adicionar o argumento --changes ou --verbose a chmod call.
por 27.11.2016 / 15:46
0

Você precisa depurar o problema. Gere um script com

echo '#!/bin/sh' > bigscript.sh
find /storage/ -name "*.dat" | xargs -n 1 echo chmod 444 >> bigscript.sh
chmod u+x bigscript.sh

Em seguida, edite o bigscript e insira as informações de depuração ( echo A , echo B , ...) depois de algumas linhas e procure erros.

O tamanho dos arquivos não importa; 800 arquivos levam pouco tempo.

Alternativas

Alternativa simples: tente chmod -v ; isso diz o que chmod está fazendo.

Outra alternativa: encontre o PID do chmod em execução (- > CHMODPID) e veja o ls -l /proc/$CHMODPID/fd

    
por 27.11.2016 / 14:32